diff options
-rw-r--r-- | gdb/gdbserver/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/gdbserver/gdbreplay.c | 35 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 12 | ||||
-rw-r--r-- | gdb/gdbserver/remote-utils.c | 6 |
4 files changed, 53 insertions, 11 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index de34786..897bb2d 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,14 @@ +2010-08-26 Pedro Alves <pedro@codesourcery.com> + + * gdbreplay.c (remote_error): New. + (gdbchar): New. + (expect): Use gdbchar. Check for error reading from GDB. + Clarify sync error output. + (play): Check for errors writing to GDB. + * linux-low.c (sigchld_handler): Really ignore `write' errors. + * remote-utils.c (getpkt): Check for errors writing to the remote + descriptor. + 2010-08-25 Pedro Alves <pedro@codesourcery.com> * linux-low.c (linux_wait_1): Move non-debugging code out of diff --git a/gdb/gdbserver/gdbreplay.c b/gdb/gdbserver/gdbreplay.c index 3ae8051..44e325b 100644 --- a/gdb/gdbserver/gdbreplay.c +++ b/gdb/gdbserver/gdbreplay.c @@ -163,6 +163,14 @@ sync_error (FILE *fp, char *desc, int expect, int got) } static void +remote_error (const char *desc) +{ + fprintf (stderr, "\n%s\n", desc); + fflush (stderr); + exit (1); +} + +static void remote_close (void) { #ifdef USE_WIN32API @@ -339,6 +347,17 @@ logchar (FILE *fp) return (ch); } +static int +gdbchar (int desc) +{ + unsigned char fromgdb; + + if (read (desc, &fromgdb, 1) != 1) + return -1; + else + return fromgdb; +} + /* Accept input from gdb and match with chars from fp (after skipping one blank) up until a \n is read from fp (which is not matched) */ @@ -346,7 +365,7 @@ static void expect (FILE *fp) { int fromlog; - unsigned char fromgdb; + int fromgdb; if ((fromlog = logchar (fp)) != ' ') { @@ -357,15 +376,16 @@ expect (FILE *fp) { fromlog = logchar (fp); if (fromlog == EOL) - { - break; - } - read (remote_desc, &fromgdb, 1); + break; + fromgdb = gdbchar (remote_desc); + if (fromgdb < 0) + remote_error ("Error during read from gdb"); } while (fromlog == fromgdb); + if (fromlog != EOL) { - sync_error (fp, "Sync error during read of gdb packet", fromlog, + sync_error (fp, "Sync error during read of gdb packet from log", fromlog, fromgdb); } } @@ -387,7 +407,8 @@ play (FILE *fp) while ((fromlog = logchar (fp)) != EOL) { ch = fromlog; - write (remote_desc, &ch, 1); + if (write (remote_desc, &ch, 1) != 1) + remote_error ("Error during write to gdb"); } } diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 8810285..62d1fb8 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -4713,8 +4713,16 @@ sigchld_handler (int signo) int old_errno = errno; if (debug_threads) - /* fprintf is not async-signal-safe, so call write directly. */ - write (2, "sigchld_handler\n", sizeof ("sigchld_handler\n") - 1); + { + do + { + /* fprintf is not async-signal-safe, so call write + directly. */ + if (write (2, "sigchld_handler\n", + sizeof ("sigchld_handler\n") - 1) < 0) + break; /* just ignore */ + } while (0); + } if (target_is_async_p ()) async_file_mark (); /* trigger a linux_wait */ diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index d64af18..81cf9bc 100644 --- a/gdb/gdbserver/remote-utils.c +++ b/gdb/gdbserver/remote-utils.c @@ -1091,7 +1091,8 @@ getpkt (char *buf) fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n", (c1 << 4) + c2, csum, buf); - write (remote_desc, "-", 1); + if (write (remote_desc, "-", 1) != 1) + return -1; } if (!noack_mode) @@ -1102,7 +1103,8 @@ getpkt (char *buf) fflush (stderr); } - write (remote_desc, "+", 1); + if (write (remote_desc, "+", 1) != 1) + return -1; if (remote_debug) { |