* linux-low.c (linux_write_memory): Bail out early if peeking
authorPedro Alves <palves@redhat.com>
Sun, 14 Mar 2010 19:34:47 +0000 (19:34 +0000)
committerPedro Alves <palves@redhat.com>
Sun, 14 Mar 2010 19:34:47 +0000 (19:34 +0000)
memory failed.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c

index f2e39fd..b8c26fa 100644 (file)
@@ -1,5 +1,10 @@
 2010-03-14  Pedro Alves  <pedro@codesourcery.com>
 
+       * linux-low.c (linux_write_memory): Bail out early if peeking
+       memory failed.
+
+2010-03-14  Pedro Alves  <pedro@codesourcery.com>
+
        * linux-low.h (struct lwp_info): New fields
        `stopped_by_watchpoint' and `stopped_data_address'.
        * linux-low.c (linux_wait_for_lwp): Check for watchpoint triggers
index 31ee6e9..1b34484 100644 (file)
@@ -2556,9 +2556,8 @@ linux_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
   return 0;
 }
 
-/* Copy LEN bytes of data from debugger memory at MYADDR
-   to inferior's memory at MEMADDR.
-   On failure (cannot write the inferior)
+/* Copy LEN bytes of data from debugger memory at MYADDR to inferior's
+   memory at MEMADDR.  On failure (cannot write to the inferior)
    returns the value of errno.  */
 
 static int
@@ -2590,13 +2589,17 @@ linux_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
 
   /* Fill start and end extra bytes of buffer with existing memory data.  */
 
+  errno = 0;
   /* Coerce the 3rd arg to a uintptr_t first to avoid potential gcc warning
      about coercing an 8 byte integer to a 4 byte pointer.  */
   buffer[0] = ptrace (PTRACE_PEEKTEXT, pid,
                      (PTRACE_ARG3_TYPE) (uintptr_t) addr, 0);
+  if (errno)
+    return errno;
 
   if (count > 1)
     {
+      errno = 0;
       buffer[count - 1]
        = ptrace (PTRACE_PEEKTEXT, pid,
                  /* Coerce to a uintptr_t first to avoid potential gcc warning
@@ -2604,9 +2607,11 @@ linux_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
                  (PTRACE_ARG3_TYPE) (uintptr_t) (addr + (count - 1)
                                                  * sizeof (PTRACE_XFER_TYPE)),
                  0);
+      if (errno)
+       return errno;
     }
 
-  /* Copy data to be written over corresponding part of buffer */
+  /* Copy data to be written over corresponding part of buffer */
 
   memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), myaddr, len);