From ff9f22f1a739cacfec1ab2be3a51ddeccb9fd9c4 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Tue, 20 Apr 2010 05:52:07 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 6 ++++++ gdb/ser-base.c | 2 +- gdb/ser-pipe.c | 15 +++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3e0547f..f785902 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 e399b77..7afd1ee 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 e0454d4..77c3a08 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. */ } } -- 2.7.4