From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8974 invoked by alias); 17 Oct 2017 14:21:09 -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 8964 invoked by uid 89); 17 Oct 2017 14:21:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-21.4 required=5.0 tests=BAYES_00,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=ham version=3.3.2 spammy=reproduction, bear, lopez, Lopez X-HELO: mail-lf0-f54.google.com Received: from mail-lf0-f54.google.com (HELO mail-lf0-f54.google.com) (209.85.215.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 17 Oct 2017 14:21:01 +0000 Received: by mail-lf0-f54.google.com with SMTP id k40so2215555lfi.4 for ; Tue, 17 Oct 2017 07:21:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=WbFrNRS34dIYPJuBoT3hPUawN8JSR9FCnyyfMb+D1BE=; b=MSu3rxgT66Ad3J3OMcdZEoGuQAyeciYPGxlfjPlkndOaIjasY+N5pGUVEE0E8jrOkG 2bc9Cn8kzO3g5I1VlK6h/vVtHpeCv8kxhYC0/Z00WPcokmxTIkH6ZsJ7LRCZyd4XDMT+ W2ZbBl+jWniVchcCRJtDUDalseahrwNGLfnguqM3CXAXjdCP9dewNSu+XX7QrdaOFfX3 lwAP5ObmP/gkFxM8pz/4bxqo9YteC9Jn1EPvCb0Grx9RK/TQKDMIlYSkMUZ0c40ld9qI ncIX/wuBbW9MGZeC8O2hQ67V12YlTqsQ35ApdDzOns4FHzKG4zJ8bitmGL762llEICbT AmuQ== X-Gm-Message-State: AMCzsaXvwFbdwjtWBvRIyr5EvnZ/6/CHiBVZ/rhjjOjjbCiMRgqS67Fm NysRZ/u0buvoP1FMn0J9z7/6l5Tu9ns5oOdjJARm/NZY X-Google-Smtp-Source: ABhQp+QU4/RUqg1Pke42kAnMKw5zglPWlWDyRJ3LEj2izZ8B6tFoJzsETi1Y6lgrsqCsYrzPw0if8zHB4auZIhmzf4s= X-Received: by 10.46.77.24 with SMTP id a24mr874716ljb.180.1508250058447; Tue, 17 Oct 2017 07:20:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.25.229.146 with HTTP; Tue, 17 Oct 2017 07:20:58 -0700 (PDT) From: Patrick Frants Date: Tue, 17 Oct 2017 14:21:00 -0000 Message-ID: Subject: [PATCH] [Bug gdb/13669] Infinite recursion in cp_print_value_fields To: gdb-patches@sourceware.org Content-Type: text/plain; charset="UTF-8" X-SW-Source: 2017-10/txt/msg00523.txt.bz2 First time contributor here, could not find a good example for this patch. Please bear with me and help me get the content into acceptable form: This fixes Bug gdb/13669 ( https://sourceware.org/bugzilla/show_bug.cgi?id=13669) cp_print_value_fields() in cp-valprint.c optionally skips static members based on options->static_field_print. Additionally cp_print_value_fields() has a parameter dont_print_statmem, which instructs the current invocation to skip static members. The "if () continue" statement (line 236) fails to take into account this parameter and therefore gdb gets into an infinite recursion involving cp_print_value_fields() and cp_print_static_field(). Sample backtrace (note dont_print_statmem=1): (gdb) bt 30 #0 0x00007ffff754737d in __libc_sigaction () from target:/lib64/libc.so.6 #1 0x0000000000527c65 in gdb_demangle (name=0xd97683 "m_blendColour", options=3) at cp-support.c:1524 #2 0x0000000000646a6f in fprintf_symbol_filtered (stream=0x7fffffffd580, name=0xd97683 "m_blendColour", lang=, arg_mode=3) at utils.c:2433 #3 0x000000000052866f in cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16284, val=0x221f040, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:267 #4 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16284, stream=0x7fffffffd580, val=0x221f040, type=) at cp-valprint.c:672 #5 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16283, val=0x221eb90, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #6 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16283, stream=0x7fffffffd580, val=0x221eb90, type=) at cp-valprint.c:672 #7 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16282, val=0x221e710, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #8 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16282, stream=0x7fffffffd580, val=0x221e710, type=) at cp-valprint.c:672 #9 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16281, val=0x221f7b0, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #10 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16281, stream=0x7fffffffd580, val=0x221f7b0, type=) at cp-valprint.c:672 #11 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16280, val=0x221e100, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #12 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16280, stream=0x7fffffffd580, val=0x221e100, type=) at cp-valprint.c:672 #13 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16279, val=0x2213190, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #14 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16279, stream=0x7fffffffd580, val=0x2213190, type=) at cp-valprint.c:672 #15 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16278, val=0x2212d20, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #16 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16278, stream=0x7fffffffd580, val=0x2212d20, type=) at cp-valprint.c:672 #17 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16277, val=0x2212860, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #18 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16277, stream=0x7fffffffd580, val=0x2212860, type=) at cp-valprint.c:672 #19 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16276, val=0x2213660, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #20 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16276, stream=0x7fffffffd580, val=0x2213660, type=) at cp-valprint.c:672 #21 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16275, val=0x22121d0, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #22 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16275, stream=0x7fffffffd580, val=0x22121d0, type=) at cp-valprint.c:672 #23 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16274, val=0x2211e10, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #24 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16274, stream=0x7fffffffd580, val=0x2211e10, type=) at cp-valprint.c:672 #25 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16273, val=0x2214210, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #26 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16273, stream=0x7fffffffd580, val=0x2214210, type=) at cp-valprint.c:672 #27 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16272, val=0x2213d60, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 #28 0x0000000000529301 in cp_print_static_field (options=0x7fffffffcda0, recurse=16272, stream=0x7fffffffd580, val=0x2213d60, type=) at cp-valprint.c:672 #29 cp_print_value_fields (type=, type@entry=0xdc90c0, real_type=, offset=offset@entry=0, address=address@entry=6295612, stream=stream@entry=0x7fffffffd580, recurse=recurse@entry=16271, val=0x22137d0, options=0x7fffffffcda0, dont_print_vb=0x0, dont_print_statmem=1) at cp-valprint.c:333 (More stack frames follow...) ------------------------------------------------ REPRODUCTION: The issue is reproducable with the test program ( https://sourceware.org/bugzilla/attachment.cgi?id=8166) provided by Daniel Lopez as part of the issue https://sourceware.org/bugzilla/show_bug.cgi?id=13669 ------------------------------------------------ CHANGELOG: 2017-10-17 Patrick Frants * gdb/cp-valprint.c (cp_print_value_fields): Obey dont_print_statmem parameter to avoid infinite recursion. ------------------------------------------------ PATCH: diff --git a/a/binutils-gdb/gdb/cp-valprint.c b/b/binutils-gdb/gdb/cp-valprint.c index fb9bfd9..9dda6e2 100644 --- a/a/binutils-gdb/gdb/cp-valprint.c +++ b/b/binutils-gdb/gdb/cp-valprint.c @@ -230,7 +230,7 @@ cp_print_value_fields (struct type *type, struct type *real_type, const gdb_byte *valaddr = value_contents_for_printing (val); /* If requested, skip printing of static fields. */ - if (!options->static_field_print + if ( (!options->static_field_print || dont_print_statmem) && field_is_static (&TYPE_FIELD (type, i))) continue;