From 0e42458d972f0c7c26ccada7675c5b6f922a5e71 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Fri, 2 Apr 2010 22:05:55 +0000 Subject: [PATCH] - [expr-cumulative] Fix using-directive memory leak (Sami Wagiaalla, BZ 578351). --- gdb-using-directive-leak.patch | 209 +++++++++++++++++++++++++++++++++ gdb.spec | 9 +- 2 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 gdb-using-directive-leak.patch diff --git a/gdb-using-directive-leak.patch b/gdb-using-directive-leak.patch new file mode 100644 index 0000000..67ae700 --- /dev/null +++ b/gdb-using-directive-leak.patch @@ -0,0 +1,209 @@ +FSF GDB variant is at: +http://sourceware.org/ml/gdb-patches/2010-03/msg00789.html + +commit 56b45f494f647360f9d6ff84f12f59c08cbe05af +Author: Sami Wagiaalla +Date: Mon Mar 29 16:08:58 2010 -0400 + + Fix using_directive memory leak. + +Index: gdb-7.0.1/gdb/buildsym.c +=================================================================== +--- gdb-7.0.1.orig/gdb/buildsym.c 2009-07-02 19:21:05.000000000 +0200 ++++ gdb-7.0.1/gdb/buildsym.c 2010-04-02 23:41:10.000000000 +0200 +@@ -387,6 +387,7 @@ finish_block (struct symbol *symbol, str + } + + block_set_using (block, using_directives, &objfile->objfile_obstack); ++ using_directives = NULL; + + record_pending_block (objfile, block, opblock); + +Index: gdb-7.0.1/gdb/cp-namespace.c +=================================================================== +--- gdb-7.0.1.orig/gdb/cp-namespace.c 2010-04-02 23:40:44.000000000 +0200 ++++ gdb-7.0.1/gdb/cp-namespace.c 2010-04-02 23:45:37.000000000 +0200 +@@ -122,7 +122,8 @@ cp_scan_for_anonymous_namespaces (const + anonymous namespace. So add symbols in it to the + namespace given by the previous component if there is + one, or to the global namespace if there isn't. */ +- cp_add_using_directive (dest, src, "", "", 0); ++ cp_add_using_directive (dest, src, "", "", 0, ++ &SYMBOL_SYMTAB (symbol)->objfile->objfile_obstack); + } + /* The "+ 2" is for the "::". */ + previous_component = next_component + 2; +@@ -134,11 +135,17 @@ cp_scan_for_anonymous_namespaces (const + } + + /* Add a using directive to using_list. If the using directive in question +- has already been added, don't add it twice. */ ++ has already been added, don't add it twice. ++ Create a new struct using_direct which imports the namespace SRC into the ++ scope DEST. ALIAS is the name of the imported namespace in the current ++ scope. If ALIAS is NULL then the namespace is known by its original name. ++ The arguments are copied into newly allocated memory so they can be ++ temporaries. */ + + void + cp_add_using_directive (const char *dest, const char *src, const char* alias, +- const char *declaration, const int line_number) ++ const char *declaration, const int line_number, ++ struct obstack *obstack) + { + struct using_direct *current; + struct using_direct *new; +@@ -148,12 +155,26 @@ cp_add_using_directive (const char *dest + for (current = using_directives; current != NULL; current = current->next) + { + if (strcmp (current->import_src, src) == 0 +- && strcmp (current->import_dest, dest) == 0) ++ && strcmp (current->import_dest, dest) == 0 ++ && ((alias == NULL && current->alias == NULL) ++ || (alias != NULL && current->alias != NULL ++ && strcmp (alias, current->alias) == 0))) + return; + } + +- using_directives = cp_add_using (dest, src, alias, declaration, +- line_number, using_directives); ++ new = OBSTACK_ZALLOC (obstack, struct using_direct); ++ ++ new->import_src = obsavestring (src, strlen (src), obstack); ++ new->import_dest = obsavestring (dest, strlen (dest), obstack); ++ ++ if (alias != NULL) ++ new->alias = obsavestring (alias, strlen (alias), obstack); ++ ++ new->declaration = obsavestring (declaration, strlen (declaration), obstack); ++ new->line_number = line_number; ++ ++ new->next = using_directives; ++ using_directives = new; + + } + +@@ -205,37 +226,6 @@ cp_is_anonymous (const char *namespace) + != NULL); + } + +-/* Create a new struct using direct which imports the namespace SRC +- into the scope DEST. ALIAS is the name of the imported namespace +- in the current scope. If ALIAS is an empty string then the +- namespace is known by its original name. +- +- Set its next member in the linked list to NEXT; allocate all memory +- using xmalloc. It copies the strings, so NAME can be a temporary +- string. */ +- +-struct using_direct * +-cp_add_using (const char *dest, +- const char *src, +- const char *alias, +- const char *declaration, +- const int line_number, +- struct using_direct *next) +-{ +- struct using_direct *retval; +- +- retval = xmalloc (sizeof (struct using_direct)); +- retval->import_src = savestring (src, strlen (src)); +- retval->import_dest = savestring (dest, strlen (dest)); +- retval->alias = savestring (alias, strlen (alias)); +- retval->declaration = savestring (declaration, strlen (declaration)); +- retval->line_number = line_number; +- retval->next = next; +- retval->searched = 0; +- +- return retval; +-} +- + /* Make a copy of the using directives in the list pointed to by + USING, using OBSTACK to allocate memory. Free all memory pointed + to by USING via xfree. */ +Index: gdb-7.0.1/gdb/cp-support.h +=================================================================== +--- gdb-7.0.1.orig/gdb/cp-support.h 2010-04-02 23:40:44.000000000 +0200 ++++ gdb-7.0.1/gdb/cp-support.h 2010-04-02 23:41:10.000000000 +0200 +@@ -101,14 +101,8 @@ extern void cp_add_using_directive (cons + const char *src, + const char *alias, + const char *declaration, +- const int line_number); +- +-extern struct using_direct *cp_add_using (const char *dest, +- const char *src, +- const char *alias, +- const char *declaration, +- const int line_number, +- struct using_direct *next); ++ const int line_number, ++ struct obstack *obstack); + + extern void cp_initialize_namespace (void); + +Index: gdb-7.0.1/gdb/dwarf2read.c +=================================================================== +--- gdb-7.0.1.orig/gdb/dwarf2read.c 2010-04-02 23:41:04.000000000 +0200 ++++ gdb-7.0.1/gdb/dwarf2read.c 2010-04-02 23:42:37.000000000 +0200 +@@ -3793,12 +3793,12 @@ read_import_statement (struct die_info * + } + } + +- using_directives = cp_add_using (import_prefix, +- canonical_name, +- import_alias, +- imported_declaration, +- line_number, +- using_directives); ++ cp_add_using_directive (import_prefix, ++ canonical_name, ++ import_alias, ++ imported_declaration, ++ line_number, ++ &cu->objfile->objfile_obstack); + } + + static void +@@ -5972,7 +5972,12 @@ read_namespace (struct die_info *die, st + if (is_anonymous) + { + const char *previous_prefix = determine_prefix (die, cu); +- cp_add_using_directive (previous_prefix, TYPE_NAME (type), "", "", dwarf2_read_decl_line(die, cu)); ++ cp_add_using_directive (previous_prefix, ++ TYPE_NAME (type), ++ "", ++ "", ++ dwarf2_read_decl_line(die, cu), ++ &objfile->objfile_obstack); + } + } + +Index: gdb-7.0.1/gdb/testsuite/gdb.cp/gdb2384-base.cc +=================================================================== +--- gdb-7.0.1.orig/gdb/testsuite/gdb.cp/gdb2384-base.cc 2009-01-03 06:58:04.000000000 +0100 ++++ gdb-7.0.1/gdb/testsuite/gdb.cp/gdb2384-base.cc 2010-04-02 23:41:10.000000000 +0200 +@@ -23,6 +23,8 @@ base::base (int _x) + { + } + ++using namespace B; ++ + int + base::meth () + { +Index: gdb-7.0.1/gdb/testsuite/gdb.cp/gdb2384-base.h +=================================================================== +--- gdb-7.0.1.orig/gdb/testsuite/gdb.cp/gdb2384-base.h 2009-01-03 06:58:04.000000000 +0100 ++++ gdb-7.0.1/gdb/testsuite/gdb.cp/gdb2384-base.h 2010-04-02 23:41:10.000000000 +0200 +@@ -16,6 +16,10 @@ + along with this program. If not, see . + */ + ++namespace B{ ++ int x; ++} ++ + class base + { + public: diff --git a/gdb.spec b/gdb.spec index be11682..978cb55 100644 --- a/gdb.spec +++ b/gdb.spec @@ -36,7 +36,7 @@ Version: 7.0.1 # 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: 37%{?_with_upstream:.upstream}%{dist} +Release: 38%{?_with_upstream:.upstream}%{dist} License: GPLv3+ Group: Development/Debuggers @@ -492,6 +492,9 @@ Patch429: gdb-bz562975-std-terminate-double-free.patch # Fix incorrect relocation of sections with duplicate name (BZ 575737). Patch431: gdb-bz575737-pie-duplicate-section-name.patch +# [expr-cumulative] Fix using-directive memory leak (Sami Wagiaalla, BZ 578351). +Patch437: gdb-using-directive-leak.patch + BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa} Requires: readline%{?_isa} BuildRequires: readline-devel%{?_isa} @@ -760,6 +763,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch428 -p1 %patch429 -p1 %patch431 -p1 +%patch437 -p1 # Always verify their applicability. %patch393 -p1 %patch335 -p1 @@ -1085,6 +1089,9 @@ fi %endif %changelog +* Fri Apr 2 2010 Jan Kratochvil - 7.0.1-38.fc12 +- [expr-cumulative] Fix using-directive memory leak (Sami Wagiaalla, BZ 578351). + * Wed Mar 31 2010 Jan Kratochvil - 7.0.1-37.fc12 - Fix crash due to gdb-readline-6.0-signal.patch (BZ 575516)