From 030aeb759908d7bcf1b87f3599bfa482a90ab6c1 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 10 Apr 2015 03:54:41 -0700 Subject: Use bfd_alloc for compressed section contents 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 | 6 ++++++ bfd/compress.c | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f50ae75..10a3ae2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2015-04-10 H.J. Lu + + * 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 PR ld/18222 diff --git a/bfd/compress.c b/bfd/compress.c index 7945344..770ea57 100644 --- a/bfd/compress.c +++ b/bfd/compress.c @@ -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; -- cgit v1.1