* ser-base.c (generic_readchar): Watch for EOF in read of error_fd.
authorDoug Evans <dje@google.com>
Tue, 20 Apr 2010 05:52:07 +0000 (05:52 +0000)
committerDoug Evans <dje@google.com>
Tue, 20 Apr 2010 05:52:07 +0000 (05:52 +0000)
* ser-pipe.c (pipe_open): Fix file descriptor leaks.
(pipe_close): Ditto.

gdb/ChangeLog
gdb/ser-base.c
gdb/ser-pipe.c

index 3e0547f00ee3dee95e2e3eb5e12831033de94deb..f78590295fc849b29eecad2478a4c1ef8b3a83d2 100644 (file)
@@ -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.
index e399b77340f053b312f809321e554ccec9888f0d..7afd1ee1c8c18f4cf1f426acacfd047e2e91b989 100644 (file)
@@ -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.
index e0454d4c17cc816496b31c0cd67a38354930317c..77c3a08e9a9850ebecca4910065e30ed4d6ca698 100644 (file)
@@ -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.  */
     }
 }