This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: bfd_get_full_section_contents memory leak, plus


On Sat, Oct 20, 2012 at 5:26 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sat, Oct 20, 2012 at 5:21 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Sat, Oct 20, 2012 at 3:17 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>> On Sat, Oct 20, 2012 at 1:28 AM, Alan Modra <amodra@gmail.com> wrote:
>>>> On Sat, Oct 20, 2012 at 10:42:21AM +1030, Alan Modra wrote:
>>>>> This on top of Tom's patch ought to cure the failures.  Testing
>>>>> in progress.
>>>>>
>>>>>       * compress.c: Reinstate 2012-10-19 change.
>>>>>       (bfd_get_full_section_contents): Don't free unless we alloc.
>>>>>       Use proper decompress size.  Delete some vars, rename others.
>>>>
>>>> Testing successful.  Committed.
>>>>
>>>
>>> It breaks objdump.  I checked in this tectase to show the
>>> error.
>>>
>>> --
>>> H.J.
>>> ---
>>> 2012-10-20  H.J. Lu  <hongjiu.lu@intel.com>
>>>
>>>         * binutils-all/compress.exp: Add an objdump test.
>>>         * binutils-all/dw2-1.W: New file.
>>>
>>
>> This patch works for me:
>>
>>
>> diff --git a/binutils/objdump.c b/binutils/objdump.c
>> index 44e857a..b1a5be6 100644
>> --- a/binutils/objdump.c
>> +++ b/binutils/objdump.c
>> @@ -2277,6 +2277,7 @@ load_specific_debug_section (enum
>> dwarf_section_display_enum debug,
>>           the bfd_section, and tell it that the contents are
>>           already in memory.  */
>>        sec->contents = section->start;
>> +      sec->compress_status = COMPRESS_SECTION_NONE;
>>        sec->flags |= SEC_IN_MEMORY;
>>        sec->size = section->size;
>>
>>
>
> This one may be better,
>
>
> --
> H.J.
> ---
> diff --git a/bfd/compress.c b/bfd/compress.c
> index 294bfd3..2ffa6f0 100644
> --- a/bfd/compress.c
> +++ b/bfd/compress.c
> @@ -166,6 +166,9 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr
> sec, bfd_byte **ptr)
>    bfd_byte *compressed_buffer;
>  #endif
>
> +  if (p != NULL && p == sec->contents)
> +    return TRUE;
> +
>    if (abfd->direction != write_direction && sec->rawsize != 0)
>      sz = sec->rawsize;
>    else

It should be.

-- 
H.J.
---
diff --git a/bfd/compress.c b/bfd/compress.c
index 294bfd3..0502f80 100644
--- a/bfd/compress.c
+++ b/bfd/compress.c
@@ -166,6 +166,11 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr
sec, bfd_byte **ptr)
   bfd_byte *compressed_buffer;
 #endif

+  if ((sec->flags & SEC_IN_MEMORY) != 0
+      && p != NULL
+      && p == sec->contents)
+    return TRUE;
+
   if (abfd->direction != write_direction && sec->rawsize != 0)
     sz = sec->rawsize;
   else


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]