Re: 3/5 - Rework stepping over longjmp support

Pedro Alves
2008-05-05T16:50:55Z

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

A Sunday 04 May 2008 20:49:43, Pedro Alves wrote:
> A Friday 02 May 2008 15:38:22, Daniel Jacobowitz wrote:
> > On Fri, Apr 25, 2008 at 05:15:45PM +0100, Pedro Alves wrote:
> > > Still OK? I'll check the new longjmp.exp test in along with this one.
> >
> > Looks fine to me.
>
> Thanks. I've checked this one in, and the test too.
>
> Non-stop mode should be now safer regarding longjmp.

Except, it's crashing in async mode ...

thread_p was only allocated when (!single_inst || skip_subroutines),
because on the other cases, we don't need longjmp breakpoints,
but, it was always being dereferenced in async mode.

There's really no reason to be using the heap. Fixed by moving
the variable to the stack (as cleanup memory is supposed to be
managed in the first place).

Checked in as obvious.

--
Pedro Alves

/me teaches himself to never do last minute changes.
--
Pedro Alves

[-- Attachment #2: fix_crash.diff --]
[-- Type: text/x-diff, Size: 1811 bytes --]

2008-05-05 Pedro Alves <pedro@codesourcery.com>

* infcmd.c (step_1): Put thread id on the stack to avoid possible
NULL dereferencing.

---
gdb/infcmd.c | 14 ++++----------
1 file changed, 4 insertions(+), 10 deletions(-)

Index: src/gdb/infcmd.c
===================================================================
--- src.orig/gdb/infcmd.c 2008-05-05 17:33:46.000000000 +0100
+++ src/gdb/infcmd.c 2008-05-05 17:34:01.000000000 +0100
@@ -706,7 +706,7 @@ step_1 (int skip_subroutines, int single
struct frame_info *frame;
struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
int async_exec = 0;
- int *thread_p = NULL;
+ int thread = -1;

ERROR_NO_INFERIOR;

@@ -730,17 +730,12 @@ step_1 (int skip_subroutines, int single

if (!single_inst || skip_subroutines) /* leave si command alone */
{
- thread_p = xmalloc (sizeof (int));
- make_cleanup (xfree, thread_p);
-
if (in_thread_list (inferior_ptid))
- *thread_p = pid_to_thread_id (inferior_ptid);
- else
- *thread_p = -1;
+ thread = pid_to_thread_id (inferior_ptid);

set_longjmp_breakpoint ();

- make_cleanup (delete_longjmp_breakpoint_cleanup, thread_p);
+ make_cleanup (delete_longjmp_breakpoint_cleanup, &thread);
}

/* In synchronous case, all is well, just use the regular for loop. */
@@ -801,11 +796,10 @@ which has no line number information.\n"
and handle them one at the time, through step_once(). */
else
{
- step_once (skip_subroutines, single_inst, count, *thread_p);
+ step_once (skip_subroutines, single_inst, count, thread);
/* We are running, and the continuation is installed. It will
disable the longjmp breakpoint as appropriate. */
discard_cleanups (cleanups);
- xfree (thread_p);
}
}