Mercurial > emacs
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;