PR 7012
* dwarf2.c (find_line): Don't keep stale pointers into realloc'd memory. Return on errors. Fix memory leak. (_bfd_dwarf2_cleanup_debug_info): Free dwarf_str_buffer.
This commit is contained in:
parent
129af99fb5
commit
5d0900ebc7
|
@ -1,3 +1,10 @@
|
||||||
|
2008-11-11 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
PR 7012
|
||||||
|
* dwarf2.c (find_line): Don't keep stale pointers into realloc'd
|
||||||
|
memory. Return on errors. Fix memory leak.
|
||||||
|
(_bfd_dwarf2_cleanup_debug_info): Free dwarf_str_buffer.
|
||||||
|
|
||||||
2008-11-10 Andreas Schwab <schwab@suse.de>
|
2008-11-10 Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
PR 7011
|
PR 7011
|
||||||
|
|
69
bfd/dwarf2.c
69
bfd/dwarf2.c
|
@ -2989,8 +2989,6 @@ find_line (bfd *abfd,
|
||||||
symbols, 0,
|
symbols, 0,
|
||||||
&stash->info_ptr_memory, &total_size))
|
&stash->info_ptr_memory, &total_size))
|
||||||
goto done;
|
goto done;
|
||||||
stash->info_ptr = stash->info_ptr_memory;
|
|
||||||
stash->info_ptr_end = stash->info_ptr + total_size;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3008,63 +3006,64 @@ find_line (bfd *abfd,
|
||||||
if (stash->info_ptr_memory == NULL)
|
if (stash->info_ptr_memory == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
stash->info_ptr = stash->info_ptr_memory;
|
total_size = 0;
|
||||||
stash->info_ptr_end = stash->info_ptr;
|
|
||||||
|
|
||||||
for (msec = find_debug_info (debug_bfd, NULL);
|
for (msec = find_debug_info (debug_bfd, NULL);
|
||||||
msec;
|
msec;
|
||||||
msec = find_debug_info (debug_bfd, msec))
|
msec = find_debug_info (debug_bfd, msec))
|
||||||
{
|
{
|
||||||
bfd_size_type size;
|
bfd_size_type size;
|
||||||
bfd_size_type start;
|
|
||||||
|
|
||||||
size = msec->size;
|
size = msec->size;
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
start = stash->info_ptr_end - stash->info_ptr;
|
if (!(bfd_simple_get_relocated_section_contents
|
||||||
|
(debug_bfd, msec, stash->info_ptr_memory + total_size,
|
||||||
|
symbols)))
|
||||||
|
goto done;
|
||||||
|
|
||||||
if ((bfd_simple_get_relocated_section_contents
|
total_size += size;
|
||||||
(debug_bfd, msec, stash->info_ptr + start, symbols))
|
|
||||||
== NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
stash->info_ptr_end = stash->info_ptr + start + size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BFD_ASSERT (stash->info_ptr_end == stash->info_ptr + total_size);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Case 3: multiple sections, some or all compressed. */
|
/* Case 3: multiple sections, some or all compressed. */
|
||||||
stash->info_ptr_memory = bfd_malloc (1);
|
stash->info_ptr_memory = NULL;
|
||||||
stash->info_ptr = stash->info_ptr_memory;
|
total_size = 0;
|
||||||
stash->info_ptr_end = stash->info_ptr;
|
|
||||||
for (msec = find_debug_info (debug_bfd, NULL);
|
for (msec = find_debug_info (debug_bfd, NULL);
|
||||||
msec;
|
msec;
|
||||||
msec = find_debug_info (debug_bfd, msec))
|
msec = find_debug_info (debug_bfd, msec))
|
||||||
{
|
{
|
||||||
bfd_size_type size = msec->size;
|
bfd_size_type size = msec->size;
|
||||||
bfd_byte* buffer
|
bfd_byte* buffer;
|
||||||
= (bfd_simple_get_relocated_section_contents
|
|
||||||
(debug_bfd, msec, NULL, symbols));
|
if (size == 0)
|
||||||
if (! buffer)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
buffer = (bfd_simple_get_relocated_section_contents
|
||||||
|
(debug_bfd, msec, NULL, symbols));
|
||||||
|
if (! buffer)
|
||||||
|
goto done;
|
||||||
|
|
||||||
if (strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0)
|
if (strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0)
|
||||||
{
|
{
|
||||||
if (! bfd_uncompress_section_contents (&buffer, &size))
|
if (! bfd_uncompress_section_contents (&buffer, &size))
|
||||||
continue;
|
{
|
||||||
|
free (buffer);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
stash->info_ptr = bfd_realloc (stash->info_ptr,
|
stash->info_ptr_memory = bfd_realloc (stash->info_ptr_memory,
|
||||||
stash->info_ptr_end
|
total_size + size);
|
||||||
- stash->info_ptr + size);
|
memcpy (stash->info_ptr_memory + total_size, buffer, size);
|
||||||
memcpy (stash->info_ptr_end, buffer, size);
|
|
||||||
free (buffer);
|
free (buffer);
|
||||||
stash->info_ptr_end += size;
|
total_size += size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stash->info_ptr = stash->info_ptr_memory;
|
||||||
|
stash->info_ptr_end = stash->info_ptr + total_size;
|
||||||
stash->sec = find_debug_info (debug_bfd, NULL);
|
stash->sec = find_debug_info (debug_bfd, NULL);
|
||||||
stash->sec_info_ptr = stash->info_ptr;
|
stash->sec_info_ptr = stash->info_ptr;
|
||||||
stash->syms = symbols;
|
stash->syms = symbols;
|
||||||
|
@ -3364,8 +3363,14 @@ _bfd_dwarf2_cleanup_debug_info (bfd *abfd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free (stash->dwarf_abbrev_buffer);
|
if (stash->dwarf_abbrev_buffer)
|
||||||
free (stash->dwarf_line_buffer);
|
free (stash->dwarf_abbrev_buffer);
|
||||||
free (stash->dwarf_ranges_buffer);
|
if (stash->dwarf_line_buffer)
|
||||||
free (stash->info_ptr_memory);
|
free (stash->dwarf_line_buffer);
|
||||||
|
if (stash->dwarf_str_buffer)
|
||||||
|
free (stash->dwarf_str_buffer);
|
||||||
|
if (stash->dwarf_ranges_buffer)
|
||||||
|
free (stash->dwarf_ranges_buffer);
|
||||||
|
if (stash->info_ptr_memory)
|
||||||
|
free (stash->info_ptr_memory);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue