diff options
author | Doug Evans <dje@google.com> | 2010-04-20 05:52:07 +0000 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2010-04-20 05:52:07 +0000 |
commit | ff9f22f1a739cacfec1ab2be3a51ddeccb9fd9c4 (patch) | |
tree | c81335d0e6fe04936e6fc6eda96d235906554add /gdb | |
parent | * gdb.base/help.exp (help source): Update expected output. (diff) | |
download | binutils-gdb-ff9f22f1a739cacfec1ab2be3a51ddeccb9fd9c4.tar.gz binutils-gdb-ff9f22f1a739cacfec1ab2be3a51ddeccb9fd9c4.tar.bz2 binutils-gdb-ff9f22f1a739cacfec1ab2be3a51ddeccb9fd9c4.zip |
* 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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/ser-base.c | 2 | ||||
-rw-r--r-- | gdb/ser-pipe.c | 15 |
3 files changed, 20 insertions, 3 deletions
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 <dje@google.com> + + * 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 <muller@ics.u-strasbg.fr> * 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. */ } } |