* 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 f2e39fd64a9b58e4380b739aa949f07163712927..b8c26faf0608fc02bd478106f8016e4a536c3c8f 100644 (file)
@@ -1,3 +1,8 @@
+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
index 31ee6e95a27406280a558bb55fd4921c8c19d4e5..1b344844bb1abf30320bab46f039957fdd8d144f 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);