From da8ce49b5542f4d28d687d63dbb90cec00d387dd Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Tue, 5 Jun 2007 17:07:00 +0000 Subject: [PATCH] - Fix crash on missing filenames debug info (BZ 242155). --- gdb-6.6-upstream.patch | 144 +++++++++++++++++++++++++++++++++++++++++ gdb.spec | 5 +- 2 files changed, 148 insertions(+), 1 deletion(-) diff --git a/gdb-6.6-upstream.patch b/gdb-6.6-upstream.patch index 886f92b..e90333f 100644 --- a/gdb-6.6-upstream.patch +++ b/gdb-6.6-upstream.patch @@ -738,3 +738,147 @@ instructions that take RMC operands. -- Alan Modra IBM OzLabs - Linux Technology Centre + + + +2007-05-14 Paul Brook + Daniel Jacobowitz + + * dwarf2read.c (dwarf2_debug_line_missing_file_complaint): New + function. + (dwarf_decode_lines): Check for line info without a file. + +--- src/gdb/dwarf2read.c 2007/04/18 13:25:04 1.218 ++++ src/gdb/dwarf2read.c 2007/05/14 17:15:20 1.219 +@@ -688,6 +688,13 @@ + } + + static void ++dwarf2_debug_line_missing_file_complaint (void) ++{ ++ complaint (&symfile_complaints, ++ _(".debug_line section has line data without a file")); ++} ++ ++static void + dwarf2_complex_location_expr_complaint (void) + { + complaint (&symfile_complaints, _("location expression too complex")); +@@ -6708,19 +6715,24 @@ + address += (adj_opcode / lh->line_range) + * lh->minimum_instruction_length; + line += lh->line_base + (adj_opcode % lh->line_range); +- lh->file_names[file - 1].included_p = 1; +- if (!decode_for_pst_p) +- { +- if (last_subfile != current_subfile) +- { +- if (last_subfile) +- record_line (last_subfile, 0, address); +- last_subfile = current_subfile; ++ if (lh->num_file_names < file) ++ dwarf2_debug_line_missing_file_complaint (); ++ else ++ { ++ lh->file_names[file - 1].included_p = 1; ++ if (!decode_for_pst_p) ++ { ++ if (last_subfile != current_subfile) ++ { ++ if (last_subfile) ++ record_line (last_subfile, 0, address); ++ last_subfile = current_subfile; ++ } ++ /* Append row to matrix using current values. */ ++ record_line (current_subfile, line, ++ check_cu_functions (address, cu)); + } +- /* Append row to matrix using current values. */ +- record_line (current_subfile, line, +- check_cu_functions (address, cu)); +- } ++ } + basic_block = 1; + } + else switch (op_code) +@@ -6734,9 +6746,15 @@ + { + case DW_LNE_end_sequence: + end_sequence = 1; +- lh->file_names[file - 1].included_p = 1; +- if (!decode_for_pst_p) +- record_line (current_subfile, 0, address); ++ ++ if (lh->num_file_names < file) ++ dwarf2_debug_line_missing_file_complaint (); ++ else ++ { ++ lh->file_names[file - 1].included_p = 1; ++ if (!decode_for_pst_p) ++ record_line (current_subfile, 0, address); ++ } + break; + case DW_LNE_set_address: + address = read_address (abfd, line_ptr, cu, &bytes_read); +@@ -6769,17 +6787,22 @@ + } + break; + case DW_LNS_copy: +- lh->file_names[file - 1].included_p = 1; +- if (!decode_for_pst_p) ++ if (lh->num_file_names < file) ++ dwarf2_debug_line_missing_file_complaint (); ++ else + { +- if (last_subfile != current_subfile) +- { +- if (last_subfile) +- record_line (last_subfile, 0, address); +- last_subfile = current_subfile; +- } +- record_line (current_subfile, line, +- check_cu_functions (address, cu)); ++ lh->file_names[file - 1].included_p = 1; ++ if (!decode_for_pst_p) ++ { ++ if (last_subfile != current_subfile) ++ { ++ if (last_subfile) ++ record_line (last_subfile, 0, address); ++ last_subfile = current_subfile; ++ } ++ record_line (current_subfile, line, ++ check_cu_functions (address, cu)); ++ } + } + basic_block = 0; + break; +@@ -6806,15 +6806,19 @@ dwarf_decode_lines (struct line_header * + + file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read); + line_ptr += bytes_read; +- fe = &lh->file_names[file - 1]; +- if (fe->dir_index) +- dir = lh->include_dirs[fe->dir_index - 1]; +- +- if (!decode_for_pst_p) +- { +- last_subfile = current_subfile; +- dwarf2_start_subfile (fe->name, dir, comp_dir, file); +- } ++ if (lh->num_file_names < file) ++ dwarf2_debug_line_missing_file_complaint (); ++ else ++ { ++ fe = &lh->file_names[file - 1]; ++ if (fe->dir_index) ++ dir = lh->include_dirs[fe->dir_index - 1]; ++ if (!decode_for_pst_p) ++ { ++ last_subfile = current_subfile; ++ dwarf2_start_subfile (fe->name, dir, comp_dir, file); ++ } ++ } + } + break; + case DW_LNS_set_column: diff --git a/gdb.spec b/gdb.spec index cb3c862..1063084 100644 --- a/gdb.spec +++ b/gdb.spec @@ -11,7 +11,7 @@ Name: gdb Version: 6.6 # The release always contains a leading reserved number, start it at 1. -Release: 14%{?dist} +Release: 15%{?dist} License: GPL Group: Development/Debuggers @@ -637,6 +637,9 @@ fi # don't include the files in include, they are part of binutils %changelog +* Tue Jun 5 2007 Jan Kratochvil - 6.6-15 +- Fix crash on missing filenames debug info (BZ 242155). + * Sat Apr 28 2007 Jan Kratochvil - 6.6-14 - Fixup for the PPC Power6/DFP instructions disassembly (BZ 230000). - New testcase for the GCORE buffer overflow (for BZ 238285, formerly 235753).