From de8f297ee074819ca815eab7a53c126caffa6130 Mon Sep 17 00:00:00 2001 From: Sergio Durigan Junior Date: Tue, 1 Oct 2013 01:38:05 -0300 Subject: [PATCH] - Fix the case when GDB leaks memory because value_struct_elt does not call check_typedef. (Doug Evans, BZ 15695, filed as RH BZ 1013453). --- ...1013453-value-struct-elt-memory-leak.patch | 136 ++++++++++++++++++ gdb.spec | 12 +- 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 gdb-rhbz1013453-value-struct-elt-memory-leak.patch diff --git a/gdb-rhbz1013453-value-struct-elt-memory-leak.patch b/gdb-rhbz1013453-value-struct-elt-memory-leak.patch new file mode 100644 index 0000000..a1af0ea --- /dev/null +++ b/gdb-rhbz1013453-value-struct-elt-memory-leak.patch @@ -0,0 +1,136 @@ +https://sourceware.org/ml/gdb-patches/2013-07/msg00469.html + +Hi. +This patch adds the missing calls to check_typedef +and adds a testcase to show the issue. + +The PR is not closeable yet, but the remaining issues are more cleanups +than actual bug fixes. + +Regression tested on amd64-linux. + +I will check this in in a few days if there are no objections. + +[The multiple calls to check_typedef (value_type (*argp)) are +bothersome, but the code is simpler this way, and I expect +resolving the rest of the issues in 15695 to potentially change this +code significantly.] + +--- + +commit cbb25189b69e501ddca64917d810b54bb1466c93 +Author: Doug Evans +Date: Thu Aug 1 23:59:47 2013 +0000 + + PR symtab/15695 + * valops.c (value_struct_elt): Add missing call to check_typedef. + (value_find_oload_method_list): Ditto. + + testsuite/ + * gdb.base/func-ptr.exp: New file. + * gdb.base/func-ptr.c: New file. + +2013-08-01 Doug Evans + + PR symtab/15695 + * valops.c (value_struct_elt): Add missing call to check_typedef. + (value_find_oload_method_list): Ditto. + +2013-08-01 Doug Evans + + PR symtab/15695 + * gdb.base/func-ptr.exp: New file. + * gdb.base/func-ptr.c: New file. + +Index: gdb-7.6.50.20130731-cvs/gdb/testsuite/gdb.base/func-ptr.c +=================================================================== +--- /dev/null ++++ gdb-7.6.50.20130731-cvs/gdb/testsuite/gdb.base/func-ptr.c +@@ -0,0 +1,30 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2013 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++void ++bar () ++{ ++} ++ ++typedef void foo (void); ++foo *pbar = bar; ++ ++int ++main () ++{ ++ return 0; ++} +Index: gdb-7.6.50.20130731-cvs/gdb/testsuite/gdb.base/func-ptr.exp +=================================================================== +--- /dev/null ++++ gdb-7.6.50.20130731-cvs/gdb/testsuite/gdb.base/func-ptr.exp +@@ -0,0 +1,30 @@ ++# Copyright 2013 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# This testcase exercises bug 15695. ++# Trying to print foo->bar if foo is a pointer to a typedef of a pointer ++# to a function will put gdb into an infinite loop. ++ ++if { [prepare_for_testing func-ptr.exp "func-ptr" {func-ptr.c} {debug}] } { ++ return -1 ++} ++ ++if ![runto_main] { ++ fail "Can't run to main" ++ return 0 ++} ++ ++# This would put gdb into an infinite loop. ++gdb_test "print pbar->baz" "Attempt to extract .*" +Index: gdb-7.6.50.20130731-cvs/gdb/valops.c +=================================================================== +--- gdb-7.6.50.20130731-cvs.orig/gdb/valops.c ++++ gdb-7.6.50.20130731-cvs/gdb/valops.c +@@ -2275,7 +2275,7 @@ value_struct_elt (struct value **argp, s + { + *argp = value_ind (*argp); + /* Don't coerce fn pointer to fn and then back again! */ +- if (TYPE_CODE (value_type (*argp)) != TYPE_CODE_FUNC) ++ if (TYPE_CODE (check_typedef (value_type (*argp))) != TYPE_CODE_FUNC) + *argp = coerce_array (*argp); + t = check_typedef (value_type (*argp)); + } +@@ -2439,7 +2439,7 @@ value_find_oload_method_list (struct val + { + *argp = value_ind (*argp); + /* Don't coerce fn pointer to fn and then back again! */ +- if (TYPE_CODE (value_type (*argp)) != TYPE_CODE_FUNC) ++ if (TYPE_CODE (check_typedef (value_type (*argp))) != TYPE_CODE_FUNC) + *argp = coerce_array (*argp); + t = check_typedef (value_type (*argp)); + } diff --git a/gdb.spec b/gdb.spec index b786703..2aa7178 100644 --- a/gdb.spec +++ b/gdb.spec @@ -38,7 +38,7 @@ Version: 7.6.50.%{snap} # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 11%{?dist} +Release: 12%{?dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain Group: Development/Debuggers @@ -524,6 +524,11 @@ Patch832: gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch # Fix crash on 'enable count' (Simon Marchi, BZ 993118). Patch843: gdb-enable-count-crash.patch +# Fix the case when GDB leaks memory because value_struct_elt +# does not call check_typedef. (Doug Evans, BZ 15695, filed as +# RH BZ 1013453). +Patch844: gdb-rhbz1013453-value-struct-elt-memory-leak.patch + %if 0%{!?rhel:1} || 0%{?rhel} > 6 # RL_STATE_FEDORA_GDB would not be found for: # Patch642: gdb-readline62-ask-more-rh.patch @@ -816,6 +821,7 @@ find -name "*.info*"|xargs rm -f %patch818 -p1 %patch832 -p1 %patch843 -p1 +%patch844 -p1 %patch393 -p1 %if 0%{!?el5:1} || 0%{?scl:1} @@ -1334,6 +1340,10 @@ fi %endif # 0%{!?el5:1} || "%{_target_cpu}" == "noarch" %changelog +* Mon Sep 30 2013 Sergio Durigan Junior - 7.6.50.20130731-12.fc20 +- Fix the case when GDB leaks memory because value_struct_elt does not call + check_typedef. (Doug Evans, BZ 15695, filed as RH BZ 1013453). + * Wed Sep 25 2013 Jan Kratochvil - 7.6.50.20130731-11.fc20 - Enable arm-linux-gnu and aarch64-linux-gnu targets on all archs (BZ 1011647).