From 7e9123a200047d0caaaa02e866aae6b7c4cebeb6 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 17 Mar 2011 22:06:34 -0700 Subject: [PATCH] * sysdep.c (sys_subshell): Use 'volatile' to avoid vfork clobbering. Before, this 'volatile' was incorrectly IF_LINTted out. --- src/ChangeLog | 3 +++ src/sysdep.c | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index da9676233e0..53f66bd8032 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,8 @@ 2011-03-18 Paul Eggert + * sysdep.c (sys_subshell): Use 'volatile' to avoid vfork clobbering. + Before, this 'volatile' was incorrectly IF_LINTted out. + * lisp.h (child_setup): Now NO_RETURN unless DOS_NT. This should get cleaned up, so that child_setup has the same signature on all platforms. diff --git a/src/sysdep.c b/src/sysdep.c index 6ef3d88c5c8..889ff6d83eb 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -488,7 +488,11 @@ sys_subshell (void) int pid; struct save_signal saved_handlers[5]; Lisp_Object dir; - unsigned char * IF_LINT (volatile) str = 0; + + /* Volatile because otherwise vfork might clobber it on some hosts. */ + unsigned char *volatile dirstr = 0; + + unsigned char *str; int len; saved_handlers[0].code = SIGINT; @@ -512,7 +516,7 @@ sys_subshell (void) goto xyzzy; dir = expand_and_dir_to_file (Funhandled_file_name_directory (dir), Qnil); - str = (unsigned char *) alloca (SCHARS (dir) + 2); + str = dirstr = (unsigned char *) alloca (SCHARS (dir) + 2); len = SCHARS (dir); memcpy (str, SDATA (dir), len); if (str[len - 1] != '/') str[len++] = '/'; @@ -544,6 +548,7 @@ sys_subshell (void) sh = "sh"; /* Use our buffer's default directory for the subshell. */ + str = dirstr; if (str && chdir ((char *) str) != 0) { #ifndef DOS_NT -- 2.39.2