]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fcall_process): Don't hold references to string data
authorAndreas Schwab <schwab@suse.de>
Sun, 7 Sep 2008 20:35:14 +0000 (20:35 +0000)
committerAndreas Schwab <schwab@suse.de>
Sun, 7 Sep 2008 20:35:14 +0000 (20:35 +0000)
across garbage collection.  Move initialisation of new_argv down
to avoid compiler bug.

src/ChangeLog
src/callproc.c

index 67cd1c3bb06d1093f37ba6418bf60f5d7cd1f266..17796a2732661df966ed42876ca8ca3cc6af9ca9 100644 (file)
@@ -1,3 +1,9 @@
+2008-09-07  Andreas Schwab  <schwab@suse.de>
+
+       * callproc.c (Fcall_process): Don't hold references to string data
+       across garbage collection.  Move initialisation of new_argv down
+       to avoid compiler bug.
+
 2008-09-07  Roland Winkler  <Roland.Winkler@physik.uni-erlangen.de>
 
        * process.c (Fsystem_process_attributes): Doc fix.
index fdfa4c78083a68989fc75723624fff7b2bd227e8..5d94b05b6083b9862397dac9b326b7d444d6d3a8 100644 (file)
@@ -226,8 +226,7 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
   int bufsize = CALLPROC_BUFFER_SIZE_MIN;
   int count = SPECPDL_INDEX ();
 
-  register const unsigned char **new_argv
-    = (const unsigned char **) alloca ((max (2, nargs - 2)) * sizeof (char *));
+  register const unsigned char **new_argv;
   struct buffer *old = current_buffer;
   /* File to use for stderr in the child.
      t means use same as standard output.  */
@@ -414,7 +413,8 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
       && SREF (path, 1) == ':')
     path = Fsubstring (path, make_number (2), Qnil);
 
-  new_argv[0] = SDATA (path);
+  new_argv = (const unsigned char **)
+    alloca (max (2, nargs - 2) * sizeof (char *));
   if (nargs > 4)
     {
       register int i;
@@ -428,13 +428,15 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)  */)
          if (CODING_REQUIRE_ENCODING (&argument_coding))
            /* We must encode this argument.  */
            args[i] = encode_coding_string (&argument_coding, args[i], 1);
-         new_argv[i - 3] = SDATA (args[i]);
        }
       UNGCPRO;
-      new_argv[nargs - 3] = 0;
+      for (i = 4; i < nargs; i++)
+       new_argv[i - 3] = SDATA (args[i]);
+      new_argv[i - 3] = 0;
     }
   else
     new_argv[1] = 0;
+  new_argv[0] = SDATA (path);
 
 #ifdef MSDOS /* MW, July 1993 */
   if ((outf = egetenv ("TMPDIR")))