diff --git a/gdb-6.6-buildid-locate-rpm.patch b/gdb-6.6-buildid-locate-rpm.patch index 6867c63..2cf06d0 100644 --- a/gdb-6.6-buildid-locate-rpm.patch +++ b/gdb-6.6-buildid-locate-rpm.patch @@ -421,7 +421,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c } @@ -1802,14 +2154,33 @@ debug_print_missing (const char *binary, - } + *slot = missing_filepair; - /* We do not collect and flush these messages as each such message diff --git a/gdb-6.6-buildid-locate.patch b/gdb-6.6-buildid-locate.patch index cfea671..6668ce4 100644 --- a/gdb-6.6-buildid-locate.patch +++ b/gdb-6.6-buildid-locate.patch @@ -646,7 +646,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c if (retval != NULL && !build_id_verify (retval, build_id)) { -@@ -1279,9 +1676,142 @@ build_id_to_debug_filename (struct build +@@ -1279,9 +1676,150 @@ build_id_to_debug_filename (struct build retval = NULL; } @@ -700,8 +700,8 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c + const struct missing_filepair *elem2) +{ + return strcmp (elem1->binary, elem2->binary) == 0 -+ && ((elem1->debug == NULL && elem2->debug == NULL) -+ || strcmp (elem1->debug, elem2->debug) == 0); ++ && ((elem1->debug == NULL) == (elem2->debug == NULL)) ++ && (elem1->debug == NULL || strcmp (elem1->debug, elem2->debug) == 0); +} + +static void @@ -732,6 +732,7 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c +{ + size_t binary_len0 = strlen (binary) + 1; + size_t debug_len0 = debug ? strlen (debug) + 1 : 0; ++ struct missing_filepair missing_filepair_find; + struct missing_filepair *missing_filepair; + struct missing_filepair **slot; + @@ -747,6 +748,27 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c + missing_filepair_xcalloc, NULL); + } + ++ /* Use MISSING_FILEPAIR_FIND first instead of calling obstack_alloc with ++ obstack_free in the case of a (rare) match. The problem is ALLOC_F for ++ MISSING_FILEPAIR_HASH allocates from MISSING_FILEPAIR_OBSTACK maintenance ++ structures for MISSING_FILEPAIR_HASH. Calling obstack_free would possibly ++ not to free only MISSING_FILEPAIR but also some such structures (allocated ++ during the htab_find_slot call). */ ++ ++ missing_filepair_find.binary = (char *) binary; ++ missing_filepair_find.debug = (char *) debug; ++ slot = (struct missing_filepair **) htab_find_slot (missing_filepair_hash, ++ &missing_filepair_find, ++ INSERT); ++ ++ /* While it may be still printed duplicitely with the missing debuginfo file ++ * it is due to once printing about the binary file build-id link and once ++ * about the .debug file build-id link as both the build-id symlinks are ++ * located in the debuginfo package. */ ++ ++ if (*slot != NULL) ++ return; ++ + missing_filepair = obstack_alloc (&missing_filepair_obstack, + sizeof (*missing_filepair) - 1 + + binary_len0 + debug_len0); @@ -760,20 +782,6 @@ Index: gdb-6.8.50.20090302/gdb/symfile.c + else + missing_filepair->debug = NULL; + -+ slot = (struct missing_filepair **) htab_find_slot (missing_filepair_hash, -+ missing_filepair, -+ INSERT); -+ -+ /* While it may be still printed duplicitely with the missing debuginfo file -+ * it is due to once printing about the binary file build-id link and once -+ * about the .debug file build-id link as both the build-id symlinks are -+ * located in the debuginfo package. */ -+ -+ if (*slot != NULL) -+ { -+ obstack_free (&missing_filepair_obstack, missing_filepair); -+ return; -+ } + *slot = missing_filepair; + + /* We do not collect and flush these messages as each such message diff --git a/gdb.spec b/gdb.spec index 3a6fe7b..c520ab8 100644 --- a/gdb.spec +++ b/gdb.spec @@ -15,7 +15,7 @@ Version: 6.8.50.20090302 # 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: 30%{?_with_upstream:.upstream}%{?dist} +Release: 31%{?_with_upstream:.upstream}%{?dist} License: GPLv3+ Group: Development/Debuggers @@ -891,6 +891,9 @@ fi %endif %changelog +* Fri Jun 12 2009 Jan Kratochvil - 6.8.50.20090302-31 +- Fix an occasional crash during printing of missing debuginfo rpms (BZ 505401). + * Fri Jun 12 2009 Jan Kratochvil - 6.8.50.20090302-30 - Implement DW_OP_call_frame_cfa (for recent GCC).