From ad3aaf330a79d6a4d42306809abff941b639950f Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Wed, 29 Apr 2009 19:55:49 +0000 Subject: [PATCH] (Fcall_process): Fix GC protection. Make sure current buffer is always restored. --- src/ChangeLog | 5 +++++ src/callproc.c | 36 ++++++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 654f8756d30..ab9af25330c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2009-04-29 Andreas Schwab + + * callproc.c (Fcall_process): Fix GC protection. Make sure + current buffer is always restored. + 2009-04-29 YAMAMOTO Mitsuharu * atimer.c (init_atimer): Also clear stopped_atimers. diff --git a/src/callproc.c b/src/callproc.c index d55fe695e76..cab30475d63 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -153,18 +153,26 @@ call_process_kill (fdpid) } 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 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) 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 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) } /* 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 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) 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 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) #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 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) 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 @@ usage: (call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS) */) 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; -- 2.39.2