changeset 98089:4ea0f5996bd5

(Fcall_process): Don't hold references to string data across garbage collection. Move initialisation of new_argv down to avoid compiler bug.
author Andreas Schwab <schwab@suse.de>
date Sun, 07 Sep 2008 20:35:14 +0000
parents b72d358fea71
children d8b291454853
files src/ChangeLog src/callproc.c
diffstat 2 files changed, 13 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sun Sep 07 20:34:05 2008 +0000
+++ b/src/ChangeLog	Sun Sep 07 20:35:14 2008 +0000
@@ -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.
--- a/src/callproc.c	Sun Sep 07 20:34:05 2008 +0000
+++ b/src/callproc.c	Sun Sep 07 20:35:14 2008 +0000
@@ -226,8 +226,7 @@
   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 @@
       && 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 @@
 	  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")))