diff options
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 22 |
2 files changed, 18 insertions, 9 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index e45050a..79904d9 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2015-08-06 Pedro Alves <palves@redhat.com> + + * linux-low.c (linux_write_memory): Rewrite debug output to avoid + reading beyond the passed in buffer length. + 2015-08-06 Pierre Langlois <pierre.langlois@arm.com> * tracepoint.c (symbol_list) <required>: Remove. diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 98fffc9..2146a2c 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -5336,15 +5336,19 @@ linux_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len) if (debug_threads) { /* Dump up to four bytes. */ - unsigned int val = * (unsigned int *) myaddr; - if (len == 1) - val = val & 0xff; - else if (len == 2) - val = val & 0xffff; - else if (len == 3) - val = val & 0xffffff; - debug_printf ("Writing %0*x to 0x%08lx in process %d\n", - 2 * ((len < 4) ? len : 4), val, (long)memaddr, pid); + char str[4 * 2 + 1]; + char *p = str; + int dump = len < 4 ? len : 4; + + for (i = 0; i < dump; i++) + { + sprintf (p, "%02x", myaddr[i]); + p += 2; + } + *p = '\0'; + + debug_printf ("Writing %s to 0x%08lx in process %d\n", + str, (long) memaddr, pid); } /* Fill start and end extra bytes of buffer with existing memory data. */ |