From Jerome Guitton <guitton@adacore.com>

* dwarf2read.c (dwarf2_debug_line_missing_end_sequence_complaint):
        New function.
        (dwarf_decode_lines): Detect null file numbers. Detect the end of
        the line program sequence when no end sequence is emitted.
This commit is contained in:
Joel Brobecker 2008-11-15 18:49:50 +00:00
parent 00b22944a0
commit 59205f5a0e
2 changed files with 31 additions and 12 deletions

View File

@ -1,3 +1,11 @@
2008-11-15 Joel Brobecker <brobecker@adacore.com>
From Jerome Guitton <guitton@adacore.com>
* dwarf2read.c (dwarf2_debug_line_missing_end_sequence_complaint):
New function.
(dwarf_decode_lines): Detect null file numbers. Detect the end of
the line program sequence when no end sequence is emitted.
2008-11-15 Joel Brobecker <brobecker@adacore.com> 2008-11-15 Joel Brobecker <brobecker@adacore.com>
* ada-lang.c (ada_evaluate_subexp): Improve handling of integer * ada-lang.c (ada_evaluate_subexp): Improve handling of integer

View File

@ -699,6 +699,13 @@ dwarf2_debug_line_missing_file_complaint (void)
_(".debug_line section has line data without a file")); _(".debug_line section has line data without a file"));
} }
static void
dwarf2_debug_line_missing_end_sequence_complaint (void)
{
complaint (&symfile_complaints,
_(".debug_line section has line program sequence without an end"));
}
static void static void
dwarf2_complex_location_expr_complaint (void) dwarf2_complex_location_expr_complaint (void)
{ {
@ -7092,6 +7099,11 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
{ {
op_code = read_1_byte (abfd, line_ptr); op_code = read_1_byte (abfd, line_ptr);
line_ptr += 1; line_ptr += 1;
if (line_ptr > line_end)
{
dwarf2_debug_line_missing_end_sequence_complaint ();
break;
}
if (op_code >= lh->opcode_base) if (op_code >= lh->opcode_base)
{ {
@ -7100,7 +7112,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
address += (adj_opcode / lh->line_range) address += (adj_opcode / lh->line_range)
* lh->minimum_instruction_length; * lh->minimum_instruction_length;
line += lh->line_base + (adj_opcode % lh->line_range); line += lh->line_base + (adj_opcode % lh->line_range);
if (lh->num_file_names < file) if (lh->num_file_names < file || file == 0)
dwarf2_debug_line_missing_file_complaint (); dwarf2_debug_line_missing_file_complaint ();
else else
{ {
@ -7132,15 +7144,6 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
{ {
case DW_LNE_end_sequence: case DW_LNE_end_sequence:
end_sequence = 1; end_sequence = 1;
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; break;
case DW_LNE_set_address: case DW_LNE_set_address:
address = read_address (abfd, line_ptr, cu, &bytes_read); address = read_address (abfd, line_ptr, cu, &bytes_read);
@ -7182,7 +7185,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
} }
break; break;
case DW_LNS_copy: case DW_LNS_copy:
if (lh->num_file_names < file) if (lh->num_file_names < file || file == 0)
dwarf2_debug_line_missing_file_complaint (); dwarf2_debug_line_missing_file_complaint ();
else else
{ {
@ -7220,7 +7223,7 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read); file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
line_ptr += bytes_read; line_ptr += bytes_read;
if (lh->num_file_names < file) if (lh->num_file_names < file || file == 0)
dwarf2_debug_line_missing_file_complaint (); dwarf2_debug_line_missing_file_complaint ();
else else
{ {
@ -7271,6 +7274,14 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
} }
} }
} }
if (lh->num_file_names < file || file == 0)
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);
}
} }
if (decode_for_pst_p) if (decode_for_pst_p)