git: 2178e8c27aad - main - sh: make smark a static variable instead of a local in main()

From: Jilles Tjoelker <jilles_at_FreeBSD.org>
Date: Thu, 08 Jun 2023 21:03:30 UTC
The branch main has been updated by jilles:

URL: https://cgit.FreeBSD.org/src/commit/?id=2178e8c27aada86ce679d90b8d6cd61dc3bc7f6b

commit 2178e8c27aada86ce679d90b8d6cd61dc3bc7f6b
Author:     Daniel Kolesa <q66@chimera-linux.org>
AuthorDate: 2023-06-07 15:06:00 +0000
Commit:     Jilles Tjoelker <jilles@FreeBSD.org>
CommitDate: 2023-06-08 21:01:43 +0000

    sh: make smark a static variable instead of a local in main()
    
    We are modifying it after setjmp and then accessing it after the jump,
    so it cannot be a local.
    
    MFC after:      1 week
    Differential Revision:  https://reviews.freebsd.org/D40415
---
 bin/sh/main.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/bin/sh/main.c b/bin/sh/main.c
index a77f9528064d..3dd2b0d83738 100644
--- a/bin/sh/main.c
+++ b/bin/sh/main.c
@@ -100,7 +100,13 @@ static char *find_dot_file(char *);
 int
 main(int argc, char *argv[])
 {
-	struct stackmark smark = {0}, smark2;
+	/*
+	 * As smark is accessed after a longjmp, it cannot be a local in main().
+	 * The C standard specifies that the values of non-volatile local
+	 * variables are unspecified after a jump if modified between the
+	 * setjmp and longjmp.
+	 */
+	static struct stackmark smark, smark2;
 	volatile int state;
 	char *shinit;