Use bfd_alloc for compressed section contents
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 10 Apr 2015 10:54:41 +0000 (03:54 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 10 Apr 2015 10:54:41 +0000 (03:54 -0700)
Compressed section contents should be bfd_alloced to avoid memory leak.
This patch replaces bfd_malloc and free with bfd_alloc and bfd_release
on compressed buffer in bfd_compress_section_contents.  There is still
a very small memory leak when compressed section isn't smaller.

* compress.c (bfd_compress_section_contents): Replace bfd_malloc
and free with bfd_alloc and bfd_release on compressed buffer.
Release buffer if compressed section isn't smaller.

bfd/ChangeLog
bfd/compress.c

index f50ae75..10a3ae2 100644 (file)
@@ -1,3 +1,9 @@
+2015-04-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * compress.c (bfd_compress_section_contents): Replace bfd_malloc
+       and free with bfd_alloc and bfd_release on compressed buffer.
+       Release buffer if compressed section isn't smaller.
+
 2015-04-10  Alan Modra  <amodra@gmail.com>
 
        PR ld/18222
index 7945344..770ea57 100644 (file)
@@ -131,7 +131,7 @@ bfd_compress_section_contents (bfd *abfd, sec_ptr sec,
       decompress = FALSE;
       buffer_size = compressed_size + compression_header_size;
     }
-  buffer = (bfd_byte *) bfd_malloc (buffer_size);
+  buffer = (bfd_byte *) bfd_alloc (abfd, buffer_size);
   if (buffer == NULL)
     return 0;
 
@@ -144,7 +144,7 @@ bfd_compress_section_contents (bfd *abfd, sec_ptr sec,
                                    buffer, uncompressed_size))
            {
              bfd_set_error (bfd_error_bad_value);
-             free (buffer);
+             bfd_release (abfd, buffer);
              return 0;
            }
          free (uncompressed_buffer);
@@ -169,7 +169,7 @@ bfd_compress_section_contents (bfd *abfd, sec_ptr sec,
                    (const Bytef*) uncompressed_buffer,
                    uncompressed_size) != Z_OK)
        {
-         free (buffer);
+         bfd_release (abfd, buffer);
          bfd_set_error (bfd_error_bad_value);
          return 0;
        }
@@ -189,6 +189,9 @@ bfd_compress_section_contents (bfd *abfd, sec_ptr sec,
        }
       else
        {
+         /* NOTE: There is a small memory leak here since
+            uncompressed_buffer is malloced and won't be freed.  */
+         bfd_release (abfd, buffer);
          sec->contents = uncompressed_buffer;
          sec->compress_status = COMPRESS_SECTION_NONE;
          return uncompressed_size;