changeset 103111:138b39938198

(Fcall_process): Fix GC protection. Make sure current buffer is always restored.
author Andreas Schwab <schwab@linux-m68k.org>
date Wed, 29 Apr 2009 19:55:49 +0000
parents 31a74a40b402
children 35792077cc20
files src/ChangeLog src/callproc.c
diffstat 2 files changed, 27 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Wed Apr 29 08:52:37 2009 +0000
+++ b/src/ChangeLog	Wed Apr 29 19:55:49 2009 +0000
@@ -1,3 +1,8 @@
+2009-04-29  Andreas Schwab  <schwab@linux-m68k.org>
+
+	* callproc.c (Fcall_process): Fix GC protection.  Make sure
+	current buffer is always restored.
+
 2009-04-29  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
 	* atimer.c (init_atimer): Also clear stopped_atimers.
--- a/src/callproc.c	Wed Apr 29 08:52:37 2009 +0000
+++ b/src/callproc.c	Wed Apr 29 19:55:49 2009 +0000
@@ -153,18 +153,26 @@
 }
 
 Lisp_Object
-call_process_cleanup (fdpid)
-     Lisp_Object fdpid;
+call_process_cleanup (arg)
+     Lisp_Object arg;
 {
+  Lisp_Object fdpid = Fcdr (arg);
+#if defined (MSDOS)
+  Lisp_Object file;
+#else
+  int pid;
+#endif
+
+  Fset_buffer (Fcar (arg));
+
 #if defined (MSDOS)
   /* for MSDOS fdpid is really (fd . tempfile)  */
-  register Lisp_Object file;
   file = Fcdr (fdpid);
   emacs_close (XFASTINT (Fcar (fdpid)));
   if (strcmp (SDATA (file), NULL_DEVICE) != 0)
     unlink (SDATA (file));
 #else /* not MSDOS */
-  register int pid = XFASTINT (Fcdr (fdpid));
+  pid = XFASTINT (Fcdr (fdpid));
 
   if (call_process_exited)
     {
@@ -231,7 +239,6 @@
   int count = SPECPDL_INDEX ();
 
   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.  */
   Lisp_Object error_file;
@@ -399,9 +406,9 @@
     }
   /* Search for program; barf if not found.  */
   {
-    struct gcpro gcpro1;
+    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
 
-    GCPRO1 (current_dir);
+    GCPRO4 (infile, buffer, current_dir, error_file);
     openp (Vexec_path, args[0], Vexec_suffixes, &path, make_number (X_OK));
     UNGCPRO;
   }
@@ -422,9 +429,9 @@
   if (nargs > 4)
     {
       register int i;
-      struct gcpro gcpro1, gcpro2, gcpro3;
+      struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
 
-      GCPRO3 (infile, buffer, current_dir);
+      GCPRO5 (infile, buffer, current_dir, path, error_file);
       argument_coding.dst_multibyte = 0;
       for (i = 4; i < nargs; i++)
 	{
@@ -630,10 +637,13 @@
 #if defined(MSDOS)
   /* MSDOS needs different cleanup information.  */
   record_unwind_protect (call_process_cleanup,
-			 Fcons (make_number (fd[0]), build_string (tempfile)));
+			 Fcons (Fcurrent_buffer (),
+				Fcons (make_number (fd[0]),
+				       build_string (tempfile))));
 #else
   record_unwind_protect (call_process_cleanup,
-			 Fcons (make_number (fd[0]), make_number (pid)));
+			 Fcons (Fcurrent_buffer (),
+				Fcons (make_number (fd[0]), make_number (pid))));
 #endif /* not MSDOS */
 
 
@@ -812,7 +822,7 @@
        coding-system used to decode the process output.  */
     if (inherit_process_coding_system)
       call1 (intern ("after-insert-file-set-buffer-file-coding-system"),
- 	       make_number (total_read));
+	     make_number (total_read));
   }
 
   /* Wait for it to terminate, unless it already has.  */
@@ -820,8 +830,6 @@
 
   immediate_quit = 0;
 
-  set_buffer_internal (old);
-
   /* Don't kill any children that the subprocess may have left behind
      when exiting.  */
   call_process_exited = 1;