From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4413 invoked by alias); 5 May 2008 16:50:55 -0000 Received: (qmail 4405 invoked by uid 22791); 5 May 2008 16:50:55 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 05 May 2008 16:50:36 +0000 Received: (qmail 8050 invoked from network); 5 May 2008 16:50:34 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 5 May 2008 16:50:34 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: 3/5 - Rework stepping over longjmp support Date: Mon, 05 May 2008 19:23:00 -0000 User-Agent: KMail/1.9.9 References: <200804070331.14538.pedro@codesourcery.com> <20080502143822.GI29202@caradoc.them.org> <200805042049.44114.pedro@codesourcery.com> In-Reply-To: <200805042049.44114.pedro@codesourcery.com> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_ZrzHINUwkdP/Fku" Message-Id: <200805051750.33084.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-05/txt/msg00211.txt.bz2 --Boundary-00=_ZrzHINUwkdP/Fku Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 885 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 --Boundary-00=_ZrzHINUwkdP/Fku Content-Type: text/x-diff; charset="utf-8"; name="fix_crash.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="fix_crash.diff" Content-length: 1811 2008-05-05 Pedro Alves * 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); } } --Boundary-00=_ZrzHINUwkdP/Fku--