From patchwork Sat Feb 9 19:50:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philippe Waroquiers X-Patchwork-Id: 31388 Received: (qmail 53375 invoked by alias); 9 Feb 2019 19:50:20 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 53310 invoked by uid 89); 9 Feb 2019 19:50:19 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-27.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=bunch, UD:emplace_back, UD:y, H*Ad:D*be X-HELO: mailsec109.isp.belgacom.be Received: from mailsec109.isp.belgacom.be (HELO mailsec109.isp.belgacom.be) (195.238.20.105) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 09 Feb 2019 19:50:16 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=skynet.be; i=@skynet.be; q=dns/txt; s=securemail; t=1549741816; x=1581277816; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=xakqt59c6abKRxtUHUWJwuTewaiw0AfphJ35AmMSjdc=; b=EUwf04utExU4GIKiLBTp17oDHvyv0wU1NwVJlPggFmN8P/VMrbk9oLAj wRNOoaQ86bjYx0gD0ldtmNnovPpJUA==; Received: from 147.122-130-109.adsl-dyn.isp.belgacom.be (HELO md.home) ([109.130.122.147]) by relay.skynet.be with ESMTP/TLS/DHE-RSA-AES128-GCM-SHA256; 09 Feb 2019 20:50:11 +0100 From: Philippe Waroquiers To: gdb-patches@sourceware.org Cc: Philippe Waroquiers Subject: [RFA] Fix type_stack leaks in c expression parsing. Date: Sat, 9 Feb 2019 20:50:00 +0100 Message-Id: <20190209195000.23057-1-philippe.waroquiers@skynet.be> MIME-Version: 1.0 X-IsSubscribed: yes Valgrind detects a bunch of leaks in several tests, such as: ==22905== 40 (24 direct, 16 indirect) bytes in 1 blocks are definitely lost in loss record 531 of 3,268 ==22905== at 0x4C2C4CC: operator new(unsigned long) (vg_replace_malloc.c:344) ==22905== by 0x5893AD: get_type_stack() (parse.c:1509) ==22905== by 0x3F4EAD: c_yyparse() (c-exp.y:1223) ==22905== by 0x3F71BC: c_parse(parser_state*) (c-exp.y:3308) ==22905== by 0x588CEA: parse_exp_in_context_1(char const**, unsigned long, block const*, int, int, int*) [clone .constprop.89] (parse.c:1205) ==22905== by 0x588FA1: parse_exp_in_context (parse.c:1108) ==22905== by 0x588FA1: parse_exp_1 (parse.c:1099) ==22905== by 0x588FA1: parse_expression(char const*) (parse.c:1247) ... ==22395== 456 (168 direct, 288 indirect) bytes in 7 blocks are definitely lost in loss record 2,658 of 2,978 ==22395== at 0x4C2C4CC: operator new(unsigned long) (vg_replace_malloc.c:344) ==22395== by 0x5893AD: get_type_stack() (parse.c:1509) ==22395== by 0x3F4ECF: c_yyparse() (c-exp.y:1230) ==22395== by 0x3F71BC: c_parse(parser_state*) (c-exp.y:3308) ==22395== by 0x588CEA: parse_exp_in_context_1(char const**, unsigned long, block const*, int, int, int*) [clone .constprop.89] (parse.c:1205) ==22395== by 0x588FA1: parse_exp_in_context (parse.c:1108) ==22395== by 0x588FA1: parse_exp_1 (parse.c:1099) ==22395== by 0x588FA1: parse_expression(char const*) (parse.c:1247) ==22395== by 0x67BB9D: whatis_exp(char const*, int) (typeprint.c:515) ... ==22395== VALGRIND_GDB_ERROR_BEGIN ==22395== 144 (24 direct, 120 indirect) bytes in 1 blocks are definitely lost in loss record 1,016 of 2,978 ==22395== at 0x4C2C4CC: operator new(unsigned long) (vg_replace_malloc.c:344) ==22395== by 0x5893AD: get_type_stack() (parse.c:1509) ==22395== by 0x3F4E8A: c_yyparse() (c-exp.y:1217) ==22395== by 0x3F71BC: c_parse(parser_state*) (c-exp.y:3308) ==22395== by 0x588CEA: parse_exp_in_context_1(char const**, unsigned long, block const*, int, int, int*) [clone .constprop.89] (parse.c:1205) ==22395== by 0x588FA1: parse_exp_in_context (parse.c:1108) ==22395== by 0x588FA1: parse_exp_1 (parse.c:1099) ==22395== by 0x588FA1: parse_expression(char const*) (parse.c:1247) ==22395== by 0x67BB9D: whatis_exp(char const*, int) (typeprint.c:515) ... Fix these by storing the allocated type_stack in the cpstate->type_stacks vector. Tested on debian/amd64, natively and under valgrind. gdb/ChangeLog 2019-02-09 Philippe Waroquiers * c-exp.y (direct_abs_decl): emplace_back type_stack. --- gdb/c-exp.y | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gdb/c-exp.y b/gdb/c-exp.y index f3ef23c75a..508e9ef28d 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -1215,12 +1215,14 @@ direct_abs_decl: '(' abs_decl ')' push_type_int ($2); push_type (tp_array); $$ = get_type_stack (); + cpstate->type_stacks.emplace_back ($$); } | array_mod { push_type_int ($1); push_type (tp_array); $$ = get_type_stack (); + cpstate->type_stacks.emplace_back ($$); } | direct_abs_decl func_mod @@ -1228,11 +1230,13 @@ direct_abs_decl: '(' abs_decl ')' push_type_stack ($1); push_typelist ($2); $$ = get_type_stack (); + cpstate->type_stacks.emplace_back ($$); } | func_mod { push_typelist ($1); $$ = get_type_stack (); + cpstate->type_stacks.emplace_back ($$); } ;