Re: General regressions in gdbserver mode [Re: [rfc target-side break conditions 0/5 v2] General info]

Luis Gustavo
2012-02-25T18:25:16Z

[-- Attachment #1: Type: text/plain, Size: 1549 bytes --]

On 02/25/2012 03:06 PM, Jan Kratochvil wrote:
> On Sat, 25 Feb 2012 16:39:55 +0100, Luis Gustavo wrote:
>> What kind of setup you're using?
>
> Fedora 17 x86_64. It does not crash for me without -lmcheck but it does crash
> for gdbserver linked with -lmcheck, gdbserver dumps core then.
>
> With valgrind gdbserver prints:
>
> Invalid read of size 8
> at: clear_gdb_breakpoint_conditions (mem-break.c:741)
> by: delete_gdb_breakpoint_at (mem-break.c:715)
> by: x86_remove_point (linux-x86-low.c:593)
> by: linux_remove_point (linux-low.c:4463)
> by: process_serial_event (server.c:3207)
> by: handle_serial_event (server.c:3340)
> by: handle_file_event (event-loop.c:489)
> by: process_event (event-loop.c:244)
> by: start_event_loop (event-loop.c:607)
> by: main (server.c:2773)
> Address 0x56242c8 is 8 bytes inside a block of size 16 free'd
> at: free (vg_replace_malloc.c:427)
> by: clear_gdb_breakpoint_conditions (mem-break.c:740)
> by: delete_gdb_breakpoint_at (mem-break.c:715)
> by: x86_remove_point (linux-x86-low.c:593)
> by: linux_remove_point (linux-low.c:4463)
> by: process_serial_event (server.c:3207)
> by: handle_serial_event (server.c:3340)
> by: handle_file_event (event-loop.c:489)
> by: process_event (event-loop.c:244)
> by: start_event_loop (event-loop.c:607)
> by: main (server.c:2773)
>
>
> Thanks,
> Jan

Could please try the following on your side?

I reproduced the crash with -lmcheck and this patch fixed it for me.

Thanks,
Luis

[-- Attachment #2: mem_fix.diff --]
[-- Type: text/x-patch, Size: 868 bytes --]

2012-02-25 Luis Machado <lgustavo@codesourcery.com>

* mem-break.c (clear_gdb_breakpoint_conditions): Fix de-allocation
of conditions.

diff --git a/gdb/gdbserver/mem-break.c b/gdb/gdbserver/mem-break.c
index c9a6035..69265cb 100644
--- a/gdb/gdbserver/mem-break.c
+++ b/gdb/gdbserver/mem-break.c
@@ -726,20 +726,19 @@ void
clear_gdb_breakpoint_conditions (CORE_ADDR addr)
{
struct breakpoint *bp = find_gdb_breakpoint_at (addr);
- struct point_cond_list *cond, **cond_p;
+ struct point_cond_list *cond, *cond_next;

if (bp == NULL || bp->cond_list == NULL)
return;

cond = bp->cond_list;
- cond_p = &bp->cond_list->next;

while (cond != NULL)
{
+ cond_next = cond->next;
free (cond->cond);
free (cond);
- cond = *cond_p;
- cond_p = &cond->next;
+ cond = cond_next;
}

bp->cond_list = NULL;