* callproc.c (Fcall_process): Use 'volatile' to avoid vfork clobbering.
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 3 May 2011 06:26:40 +0000 (23:26 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 3 May 2011 06:26:40 +0000 (23:26 -0700)
src/ChangeLog
src/callproc.c

index 56e1ac9..ccf1fea 100644 (file)
@@ -1,5 +1,7 @@
 2011-05-03  Paul Eggert  <eggert@cs.ucla.edu>
 
+       * callproc.c (Fcall_process): Use 'volatile' to avoid vfork clobbering.
+
        * process.c (Fformat_network_address): Fix typo: args2 -> *args2.
 
        * xmenu.c (set_frame_menubar): Fix typo: int * -> int (3 times).
index 4a29e95..c2c301e 100644 (file)
@@ -192,7 +192,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
   int count = SPECPDL_INDEX ();
   volatile USE_SAFE_ALLOCA;
 
-  const unsigned char **volatile new_argv_volatile;
   register const unsigned char **new_argv;
   /* File to use for stderr in the child.
      t means use same as standard output.  */
@@ -415,7 +414,6 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
 
   SAFE_ALLOCA (new_argv, const unsigned char **,
               (nargs > 4 ? nargs - 2 : 2) * sizeof *new_argv);
-  new_argv_volatile = new_argv;
   if (nargs > 4)
     {
       register size_t i;
@@ -590,9 +588,20 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
 
     BLOCK_INPUT;
 
-    pid = vfork ();
+    /* vfork, and prevent local vars from being clobbered by the vfork.  */
+   {
+      int volatile fd_error_volatile = fd_error;
+      int volatile fd_output_volatile = fd_output;
+      int volatile output_to_buffer_volatile = output_to_buffer;
+      unsigned char const **volatile new_argv_volatile = new_argv;
 
-    new_argv = new_argv_volatile;
+      pid = vfork ();
+
+      fd_error = fd_error_volatile;
+      fd_output = fd_output_volatile;
+      output_to_buffer = output_to_buffer_volatile;
+      new_argv = new_argv_volatile;
+    }
 
     if (pid == 0)
       {