From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10922 invoked by alias); 6 May 2013 02:59:11 -0000 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 Received: (qmail 10899 invoked by uid 89); 6 May 2013 02:59:05 -0000 X-Spam-SWARE-Status: No, score=-6.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS,TW_XS autolearn=ham version=3.3.1 Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Mon, 06 May 2013 02:59:04 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r462x3PQ013290 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 5 May 2013 22:59:03 -0400 Received: from psique (ovpn-113-115.phx2.redhat.com [10.3.113.115]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r462wxP0003640 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Sun, 5 May 2013 22:59:02 -0400 From: Sergio Durigan Junior To: GDB Patches Cc: "Dr. David Alan Gilbert" Subject: [PATCH] Fix for PR 15413 (segfault when completing "condition" for pending bp) X-URL: http://www.redhat.com Date: Mon, 06 May 2013 02:59:00 -0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2013-05/txt/msg00087.txt.bz2 Hi, This patch is a fix for PR 15413. The failure happens when one tries to complete the argument for the "condition" command if there is only a pending breakpoint inserted. In this case, GDB segfaults. The submitter pinged me on IRC this Sunday with a suggestion to fix the issue, which correctly eliminated the segfault but still wasn't complete because the "condition" completer did not complete the breakpoint number yet. I modified the code so that the completion now works OK and no segfault happens. The fix is trivial IMO, so it shouldn't take long to approve the patch. Regtested on Fedora 17 x86_64, no regressions. OK to apply? -- Sergio gdb/ 2013-05-05 Sergio Durigan Junior PR breakpoints/15413: * breakpoint.c (condition_completer): Rewrite parts of the code to handle completion of the "condition" command for pending breakpoints. gdb/testsuite/ 2013-05-05 Sergio Durigan Junior PR breakpoints/15413: * gdb.base/pending.exp: Add test for completion of the "condition" command for pending breakpoints. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 35ada7a..81bf5ed 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1013,25 +1013,36 @@ condition_completer (struct cmd_list_element *cmd, ALL_BREAKPOINTS (b) { - int single = b->loc->next == NULL; - struct bp_location *loc; + struct bp_location *loc = NULL; int count = 1; - for (loc = b->loc; loc; loc = loc->next) + do { char location[50]; - if (single) - xsnprintf (location, sizeof (location), "%d", b->number); + if (b->loc == NULL) + { + /* We're probably dealing with a pending breakpoint. Just + inform its number. */ + xsnprintf (location, sizeof (location), "%d", b->number); + } else - xsnprintf (location, sizeof (location), "%d.%d", b->number, - count); + { + if (b->loc->next == NULL) + xsnprintf (location, sizeof (location), "%d", b->number); + else + xsnprintf (location, sizeof (location), "%d.%d", b->number, + count); + + loc = b->loc->next; + } if (strncmp (location, text, len) == 0) VEC_safe_push (char_ptr, result, xstrdup (location)); ++count; } + while (loc != NULL); } return result; diff --git a/gdb/testsuite/gdb.base/pending.exp b/gdb/testsuite/gdb.base/pending.exp index 68322f5..a8dbef5 100644 --- a/gdb/testsuite/gdb.base/pending.exp +++ b/gdb/testsuite/gdb.base/pending.exp @@ -55,6 +55,13 @@ gdb_test_multiple "break pendfunc1" "set pending breakpoint" { } } +# Complete the condition (PR 15413). +# This test must come right after we set the first pending breakpoint, and +# before we set any other breakpoint, since we are testing if the "condition" +# command can properly complete its argument. The PR only fails if there +# is only one pending breakpoint set (without anything else). +gdb_test "complete condition " "condition 1" + gdb_test "info break" \ "Num Type\[ \]+Disp Enb Address\[ \]+What.* \[0-9\]+\[\t \]+breakpoint keep y.*PENDING.*pendfunc1.*" \