This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: 3/5 - Rework stepping over longjmp support


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
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);
     }
 }
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]