From: Pedro Alves Date: Thu, 30 Jul 2015 15:15:24 +0000 (+0100) Subject: Fix gdbserver --debug issues caught by Valgrind X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bf47e2482d3e88580ba5a22db48bc773fa8ced3f;p=binutils-gdb.git Fix gdbserver --debug issues caught by Valgrind Running gdbserver --debug under Valgrind shows: ==4803== Invalid read of size 4 ==4803== at 0x432B62: linux_write_memory (linux-low.c:5320) ==4803== by 0x4143F7: write_inferior_memory (target.c:83) ==4803== by 0x415895: remove_memory_breakpoint (mem-break.c:362) ==4803== by 0x432EF5: linux_remove_point (linux-low.c:5460) ==4803== by 0x416319: delete_raw_breakpoint (mem-break.c:802) ==4803== by 0x4163F3: release_breakpoint (mem-break.c:842) ==4803== by 0x416477: delete_breakpoint_1 (mem-break.c:869) ==4803== by 0x4164EF: delete_breakpoint (mem-break.c:891) ==4803== by 0x416843: delete_gdb_breakpoint_1 (mem-break.c:1069) ==4803== by 0x4168D8: delete_gdb_breakpoint (mem-break.c:1098) ==4803== by 0x4134E3: process_serial_event (server.c:4051) ==4803== by 0x4138E4: handle_serial_event (server.c:4196) ==4803== Address 0x4c6b930 is 0 bytes inside a block of size 1 alloc'd ==4803== at 0x4A0645D: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==4803== by 0x4240C6: xmalloc (common-utils.c:43) ==4803== by 0x41439C: write_inferior_memory (target.c:80) ==4803== by 0x415895: remove_memory_breakpoint (mem-break.c:362) ==4803== by 0x432EF5: linux_remove_point (linux-low.c:5460) ==4803== by 0x416319: delete_raw_breakpoint (mem-break.c:802) ==4803== by 0x4163F3: release_breakpoint (mem-break.c:842) ==4803== by 0x416477: delete_breakpoint_1 (mem-break.c:869) ==4803== by 0x4164EF: delete_breakpoint (mem-break.c:891) ==4803== by 0x416843: delete_gdb_breakpoint_1 (mem-break.c:1069) ==4803== by 0x4168D8: delete_gdb_breakpoint (mem-break.c:1098) ==4803== by 0x4134E3: process_serial_event (server.c:4051) ==4803== And: ==7272== Conditional jump or move depends on uninitialised value(s) ==7272== at 0x3615E48361: vfprintf (vfprintf.c:1634) ==7272== by 0x414E89: debug_vprintf (debug.c:60) ==7272== by 0x42800A: debug_printf (common-debug.c:35) ==7272== by 0x43937B: my_waitpid (linux-waitpid.c:149) ==7272== by 0x42D740: linux_wait_for_event_filtered (linux-low.c:2441) ==7272== by 0x42DADA: linux_wait_for_event (linux-low.c:2552) ==7272== by 0x42E165: linux_wait_1 (linux-low.c:2860) ==7272== by 0x42F5D8: linux_wait (linux-low.c:3453) ==7272== by 0x4144A4: mywait (target.c:107) ==7272== by 0x413969: handle_target_event (server.c:4214) ==7272== by 0x41A1A6: handle_file_event (event-loop.c:429) ==7272== by 0x41996D: process_event (event-loop.c:184) gdb/ChangeLog: 2015-08-06 Pedro Alves * nat/linux-waitpid.c (my_waitpid): Only print *status if waitpid returned > 0. gdb/gdbserver/ChangeLog: 2015-08-06 Pedro Alves * linux-low.c (linux_write_memory): Rewrite debug output to avoid reading beyond the passed in buffer length. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 591fe250b2c..193581f4b76 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-08-06 Pedro Alves + + * nat/linux-waitpid.c (my_waitpid): Only print *status if waitpid + returned > 0. + 2015-08-06 Pierre Langlois * common/agent.c (symbol_list) : Remove. diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index e45050a67a6..79904d9bc05 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2015-08-06 Pedro Alves + + * linux-low.c (linux_write_memory): Rewrite debug output to avoid + reading beyond the passed in buffer length. + 2015-08-06 Pierre Langlois * tracepoint.c (symbol_list) : Remove. diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 98fffc992ee..2146a2c3e76 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. */ diff --git a/gdb/nat/linux-waitpid.c b/gdb/nat/linux-waitpid.c index 97149bd144c..cbcdd95afa9 100644 --- a/gdb/nat/linux-waitpid.c +++ b/gdb/nat/linux-waitpid.c @@ -144,7 +144,7 @@ my_waitpid (int pid, int *status, int flags) } linux_debug ("my_waitpid (%d, 0x%x): status(%x), %d\n", - pid, flags, status ? *status : -1, ret); + pid, flags, (ret > 0 && status != NULL) ? *status : -1, ret); errno = out_errno; return ret;