[gdb/f14/master] - Fix infinite loop crash on self-referencing class (BZ 627432).

Jan Kratochvil jkratoch at fedoraproject.org
Sat Sep 25 13:15:36 UTC 2010


commit 6431dd63128ae0591b591112edb7488ab3cc51d5
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date:   Sat Sep 25 15:15:33 2010 +0200

    - Fix infinite loop crash on self-referencing class (BZ 627432).

 gdb-bz627432-loop-static-self-class.patch |  280 +++++++++++++++++++++++++++++
 gdb.spec                                  |    9 +-
 2 files changed, 288 insertions(+), 1 deletions(-)
---
diff --git a/gdb-bz627432-loop-static-self-class.patch b/gdb-bz627432-loop-static-self-class.patch
new file mode 100644
index 0000000..7a03f17
--- /dev/null
+++ b/gdb-bz627432-loop-static-self-class.patch
@@ -0,0 +1,280 @@
+http://sourceware.org/ml/gdb-patches/2010-09/msg00440.html
+Subject: [patch] Fix infinite loop crash on self-referencing class
+
+Hi,
+
+class C { static C s; }; is a problem for GDB as it references itself and it
+can crash.  Downstream Bug:
+	https://bugzilla.redhat.com/show_bug.cgi?id=627432
+
+#3  0x00000000005b2cc5 in gnuv3_pass_by_reference (type=0x1044d3c8) at ../../gdb/gnu-v3-abi.c:840
+#4  0x00000000005b2cc5 in gnuv3_pass_by_reference (type=0x1044d3c8) at ../../gdb/gnu-v3-abi.c:840
+[...]
+
+No regressions on {x86_64,x86_64-m32,i686}-fedora13-linux-gnu.
+
+FYI the .cc file is not reproducible on - and only on - Fedora 14 GCC, filed:
+	https://bugzilla.redhat.com/show_bug.cgi?id=637315
+
+I would even check it in in some time.
+
+
+Thanks,
+Jan
+
+
+gdb/
+2010-09-24  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	Fix GDB crash on inferior calls with self-referencing classes.
+	* gnu-v3-abi.c (gnuv3_pass_by_reference): Do not call itself on static
+	member fields.
+
+gdb/testsuite/
+2010-09-24  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	Fix GDB crash on inferior calls with self-referencing classes.
+	* gdb.dwarf2/dw2-cp-infcall-ref-static.exp: New file.
+	* gdb.dwarf2/dw2-cp-infcall-ref-static-main.c: New file.
+	* gdb.dwarf2/dw2-cp-infcall-ref-static.S: New file.
+
+--- a/gdb/gnu-v3-abi.c
++++ b/gdb/gnu-v3-abi.c
+@@ -835,9 +835,10 @@ gnuv3_pass_by_reference (struct type *type)
+      by reference, so does this class.  Similarly for members, which
+      are constructed whenever this class is.  We do not need to worry
+      about recursive loops here, since we are only looking at members
+-     of complete class type.  */
++     of complete class type.  Also ignore any static members.  */
+   for (fieldnum = 0; fieldnum < TYPE_NFIELDS (type); fieldnum++)
+-    if (gnuv3_pass_by_reference (TYPE_FIELD_TYPE (type, fieldnum)))
++    if (TYPE_FIELD_LOC_KIND (type, fieldnum) == FIELD_LOC_KIND_BITPOS
++        && gnuv3_pass_by_reference (TYPE_FIELD_TYPE (type, fieldnum)))
+       return 1;
+ 
+   return 0;
+--- /dev/null
++++ b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static-main.c
+@@ -0,0 +1,51 @@
++/* This testcase is part of GDB, the GNU debugger.
++
++   Copyright 2010 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 <http://www.gnu.org/licenses/>.  */
++
++/* class C
++     {
++     public:
++       static C s;
++     };
++   C C::s;
++   C f()
++   {
++     return C::s;
++   }  */
++
++asm (".globl cu_text_start");
++asm ("cu_text_start:");
++
++asm (".globl f_start");
++asm ("f_start:");
++
++void
++f (void)
++{
++}
++
++asm (".globl f_end");
++asm ("f_end:");
++
++int
++main (void)
++{
++  f ();
++  return 0;
++}
++
++asm (".globl cu_text_end");
++asm ("cu_text_end:");
+--- /dev/null
++++ b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S
+@@ -0,0 +1,115 @@
++/* This testcase is part of GDB, the GNU debugger.
++
++   Copyright 2010 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 <http://www.gnu.org/licenses/>.  */
++
++/* Debug information */
++
++	.section .debug_info
++.Lcu1_begin:
++	/* CU header */
++	.4byte	.Lcu1_end - .Lcu1_start		/* Length of Compilation Unit */
++.Lcu1_start:
++	.2byte	2				/* DWARF Version */
++	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
++	.byte	4				/* Pointer size */
++
++	/* CU die */
++	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
++	.4byte	cu_text_start			/* DW_AT_low_pc */
++	.4byte	cu_text_end			/* DW_AT_high_pc */
++	.ascii	"file1.txt\0"			/* DW_AT_name */
++	.ascii	"GNU C 3.3.3\0"			/* DW_AT_producer */
++	.byte	4				/* DW_AT_language (DW_LANG_C_plus_plus) */
++
++.Ltype_class:
++	.uleb128	3			/* Abbrev: DW_TAG_class_type */
++	.ascii		"C\0"			/* DW_AT_name */
++
++	.uleb128	4			/* Abbrev: DW_TAG_member */
++	.ascii		"s\0"			/* DW_AT_name */
++	.4byte		.Ltype_class-.Lcu1_begin /* DW_AT_type */
++	.byte		1			/* DW_AT_declaration */
++	.byte		1			/* DW_AT_external */
++
++	.byte		0			/* End of children of DW_TAG_class_type */
++
++	.uleb128	5			/* Abbrev: DW_TAG_subprogram */
++	.ascii		"f\0"			/* DW_AT_name */
++	.4byte		.Ltype_class-.Lcu1_begin /* DW_AT_type */
++	.4byte		f_start			/* DW_AT_low_pc */
++	.4byte		f_end			/* DW_AT_high_pc */
++
++	.byte		0			/* End of children of CU */
++
++.Lcu1_end:
++
++/* Abbrev table */
++	.section .debug_abbrev
++.Labbrev1_begin:
++	.uleb128	1			/* Abbrev code */
++	.uleb128	0x11			/* DW_TAG_compile_unit */
++	.byte		1			/* has_children */
++	.uleb128	0x11			/* DW_AT_low_pc */
++	.uleb128	0x1			/* DW_FORM_addr */
++	.uleb128	0x12			/* DW_AT_high_pc */
++	.uleb128	0x1			/* DW_FORM_addr */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0x25			/* DW_AT_producer */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0x13			/* DW_AT_language */
++	.uleb128	0xb			/* DW_FORM_data1 */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	3			/* Abbrev code */
++	.uleb128	0x2			/* DW_TAG_class_type */
++	.byte		1			/* has_children */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	4			/* Abbrev code */
++	.uleb128	0xd			/* DW_TAG_member */
++	.byte		0			/* has_children */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0x49			/* DW_AT_type */
++	.uleb128	0x13			/* DW_FORM_ref4 */
++	.uleb128	0x3c			/* DW_AT_declaration */
++	.uleb128	0xc			/* DW_FORM_flag */
++	.uleb128	0x3f			/* DW_AT_external */
++	.uleb128	0xc			/* DW_FORM_flag */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.uleb128	5			/* Abbrev code */
++	.uleb128	0x2e			/* DW_TAG_subprogram */
++	.byte		0			/* has_children */
++	.uleb128	0x3			/* DW_AT_name */
++	.uleb128	0x8			/* DW_FORM_string */
++	.uleb128	0x49			/* DW_AT_type */
++	.uleb128	0x13			/* DW_FORM_ref4 */
++	.uleb128	0x11			/* DW_AT_low_pc */
++	.uleb128	0x1			/* DW_FORM_addr */
++	.uleb128	0x12			/* DW_AT_high_pc */
++	.uleb128	0x1			/* DW_FORM_addr */
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
++
++	.byte		0x0			/* Terminator */
++	.byte		0x0			/* Terminator */
+--- /dev/null
++++ b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp
+@@ -0,0 +1,49 @@
++# Copyright 2010 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 <http://www.gnu.org/licenses/>.
++
++# Check that GDB can call C++ functions whose parameters or return values have
++# type containing a static member of the same type.
++
++# Still no C++ compiler is used.
++if { [skip_cplus_tests] } { continue }
++
++# This test can only be run on targets which support DWARF-2 and use gas.
++# For now pick a sampling of likely targets.
++if {![istarget *-*-linux*]
++    && ![istarget *-*-gnu*]
++    && ![istarget *-*-elf*]
++    && ![istarget *-*-openbsd*]
++    && ![istarget arm-*-eabi*]
++    && ![istarget powerpc-*-eabi*]} {
++    return 0  
++}
++
++set testfile "dw2-cp-infcall-ref-static"
++if { [prepare_for_testing ${testfile}.exp ${testfile} [list ${testfile}-main.c ${testfile}.S] {}] } {
++    return -1
++}
++
++if ![runto_main] then {
++    return -1
++}
++
++# main is not provided by DWARF.
++gdb_test_no_output "set language c++"
++
++# There are no mangled names in DWARF to suggest the v3 ABI.
++gdb_test_no_output "set cp-abi gnu-v3"
++
++# GDB could crash.  There is no DW_AT_location so it is <optimized out>.
++gdb_test "p f()" { = {static s = <optimized out>}}
+
diff --git a/gdb.spec b/gdb.spec
index 62daf32..40436da 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -27,7 +27,7 @@ Version: 7.2
 
 # 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: 10%{?_with_upstream:.upstream}%{dist}
+Release: 11%{?_with_upstream:.upstream}%{dist}
 
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and GFDL and BSD and Public Domain
 Group: Development/Debuggers
@@ -438,6 +438,9 @@ Patch503: gdb-pr12028-double-free.patch
 # Fix gcore writer for -Wl,-z,relro (PR corefiles/11804).
 Patch504: gdb-bz623749-gcore-relro.patch
 
+# Fix infinite loop crash on self-referencing class (BZ 627432).
+Patch506: gdb-bz627432-loop-static-self-class.patch
+
 BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
 Requires: readline%{?_isa}
 BuildRequires: readline-devel%{?_isa}
@@ -700,6 +703,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
 %patch502 -p1
 %patch503 -p1
 %patch504 -p1
+%patch506 -p1
 
 %patch393 -p1
 %patch335 -p1
@@ -1084,6 +1088,9 @@ fi
 %endif
 
 %changelog
+* Sat Sep 25 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.2-11.fc14
+- Fix infinite loop crash on self-referencing class (BZ 627432).
+
 * Thu Sep 23 2010 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.2-10.fc14
 - gcore/-Wl,-z,relro: Always write out all the pages until kernel gets a fix.
 


More information about the scm-commits mailing list