diff options
author | Richard M. Stallman <[email protected]> | 1994-03-22 20:17:17 +0000 |
---|---|---|
committer | Richard M. Stallman <[email protected]> | 1994-03-22 20:17:17 +0000 |
commit | 6b6e798bb363882ac2aa1f91255ade8574977a38 (patch) | |
tree | 337dec5f002b6d08478833a10c2a4ac2653e881c | |
parent | b01150e7ca249aa187a4b0b8744bcb3a87ffd690 (diff) |
(Fcall_process): Make sure to close descriptors.
(call_process_cleanup): Always close descriptor.
-rw-r--r-- | src/callproc.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/callproc.c b/src/callproc.c index 21d0f444a7..9b99e29f40 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -127,8 +127,12 @@ call_process_cleanup (fdpid) #else /* not MSDOS */ register int pid = XFASTINT (Fcdr (fdpid)); + if (call_process_exited) - return Qnil; + { + close (XFASTINT (Fcar (fdpid))); + return Qnil; + } if (EMACS_KILLPG (pid, SIGINT) == 0) { @@ -330,6 +334,8 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.") synch_process_retcode = 0; #ifdef MSDOS /* MW, July 1993 */ + /* ??? Someone who knows MSDOG needs to check whether this properly + closes all descriptors that it opens. */ pid = run_msdos_command (new_argv, current_dir, filefd, outfilefd); close (outfilefd); fd1 = -1; /* No harm in closing that one! */ @@ -337,6 +343,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.") if (fd[0] < 0) { unlink (tempfile); + close (filefd); report_file_error ("Cannot re-open temporary file", Qnil); } #else /* not MSDOS */ @@ -355,15 +362,10 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.") } #endif /* not MSDOS */ -#if 0 - /* Tell SIGCHLD handler to look for this pid. */ - synch_process_pid = pid; - /* Now let SIGCHLD come through. */ - sigsetmask (mask); -#endif - environ = save_environ; + /* Close most of our fd's, but not fd[0] + since we will use that to read input from. */ close (filefd); if (fd1 >= 0) close (fd1); @@ -371,12 +373,15 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.") if (pid < 0) { - close (fd[0]); + if (fd[0] >= 0) + close (fd[0]); report_file_error ("Doing vfork", Qnil); } if (XTYPE (buffer) == Lisp_Int) { + if (fd[0] >= 0) + close (fd[0]); #ifndef subprocesses /* If Emacs has been built with asynchronous subprocess support, we don't need to do this, I think because it will then have @@ -386,6 +391,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you quit again.") return Qnil; } + /* Enable sending signal if user quits below. */ call_process_exited = 0; #ifdef MSDOS |