From: Doug Evans Date: Tue, 20 Apr 2010 05:52:07 +0000 (+0000) Subject: * ser-base.c (generic_readchar): Watch for EOF in read of error_fd. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ff9f22f1a739cacfec1ab2be3a51ddeccb9fd9c4;p=binutils-gdb.git * ser-base.c (generic_readchar): Watch for EOF in read of error_fd. * ser-pipe.c (pipe_open): Fix file descriptor leaks. (pipe_close): Ditto. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3e0547f00ee..f78590295fc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-04-19 Doug Evans + + * ser-base.c (generic_readchar): Watch for EOF in read of error_fd. + * ser-pipe.c (pipe_open): Fix file descriptor leaks. + (pipe_close): Ditto. + 2010-04-19 Pierre Muller * configure.tgt (x86_64-*-mingw*): Set BUILD_GDBSERVER to yes. diff --git a/gdb/ser-base.c b/gdb/ser-base.c index e399b77340f..7afd1ee1c8c 100644 --- a/gdb/ser-base.c +++ b/gdb/ser-base.c @@ -361,7 +361,7 @@ generic_readchar (struct serial *scb, int timeout, break; s = read (scb->error_fd, &buf, to_read); - if (s == -1) + if (s <= 0) break; /* In theory, embedded newlines are not a problem. diff --git a/gdb/ser-pipe.c b/gdb/ser-pipe.c index e0454d4c17c..77c3a08e9a9 100644 --- a/gdb/ser-pipe.c +++ b/gdb/ser-pipe.c @@ -66,7 +66,11 @@ pipe_open (struct serial *scb, const char *name) if (socketpair (AF_UNIX, SOCK_STREAM, 0, pdes) < 0) return -1; if (socketpair (AF_UNIX, SOCK_STREAM, 0, err_pdes) < 0) - return -1; + { + close (pdes[0]); + close (pdes[1]); + return -1; + } /* Create the child process to run the command in. Note that the apparent call to vfork() below *might* actually be a call to @@ -123,6 +127,8 @@ pipe_open (struct serial *scb, const char *name) /* Parent. */ close (pdes[1]); + if (err_pdes[1] != -1) + close (err_pdes[1]); /* :end chunk */ state = XMALLOC (struct pipe_state); state->pid = pid; @@ -145,10 +151,15 @@ pipe_close (struct serial *scb) int pid = state->pid; close (scb->fd); scb->fd = -1; + if (scb->error_fd != -1) + close (scb->error_fd); + scb->error_fd = -1; xfree (state); scb->state = NULL; kill (pid, SIGTERM); - /* Might be useful to check that the child does die. */ + /* Might be useful to check that the child does die, + and while we're waiting for it to die print any remaining + stderr output. */ } }