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 <palves@redhat.com> * nat/linux-waitpid.c (my_waitpid): Only print *status if waitpid returned > 0. gdb/gdbserver/ChangeLog: 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.
This commit is contained in:
parent
f6a9d9c7db
commit
bf47e2482d
4 changed files with 24 additions and 10 deletions
|
@ -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. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue