aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard M. Stallman <[email protected]>1994-03-22 20:17:17 +0000
committerRichard M. Stallman <[email protected]>1994-03-22 20:17:17 +0000
commit6b6e798bb363882ac2aa1f91255ade8574977a38 (patch)
tree337dec5f002b6d08478833a10c2a4ac2653e881c
parentb01150e7ca249aa187a4b0b8744bcb3a87ffd690 (diff)
(Fcall_process): Make sure to close descriptors.
(call_process_cleanup): Always close descriptor.
-rw-r--r--src/callproc.c24
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