diff options
Diffstat (limited to 'bfd/compress.c')
-rw-r--r-- | bfd/compress.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/bfd/compress.c b/bfd/compress.c index 17b5928..294bfd3 100644 --- a/bfd/compress.c +++ b/bfd/compress.c @@ -161,11 +161,9 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr) bfd_byte *p = *ptr; #ifdef HAVE_ZLIB_H bfd_boolean ret; - bfd_size_type compressed_size; - bfd_size_type uncompressed_size; - bfd_size_type rawsize; + bfd_size_type save_size; + bfd_size_type save_rawsize; bfd_byte *compressed_buffer; - bfd_byte *uncompressed_buffer; #endif if (abfd->direction != write_direction && sec->rawsize != 0) @@ -199,45 +197,44 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr) return FALSE; #else /* Read in the full compressed section contents. */ - uncompressed_size = sec->size; - compressed_size = sec->compressed_size; - compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size); + compressed_buffer = (bfd_byte *) bfd_malloc (sec->compressed_size); if (compressed_buffer == NULL) return FALSE; - rawsize = sec->rawsize; + save_rawsize = sec->rawsize; + save_size = sec->size; /* Clear rawsize, set size to compressed size and set compress_status to COMPRESS_SECTION_NONE. If the compressed size is bigger than the uncompressed size, bfd_get_section_contents will fail. */ sec->rawsize = 0; - sec->size = compressed_size; + sec->size = sec->compressed_size; sec->compress_status = COMPRESS_SECTION_NONE; ret = bfd_get_section_contents (abfd, sec, compressed_buffer, - 0, compressed_size); + 0, sec->compressed_size); /* Restore rawsize and size. */ - sec->rawsize = rawsize; - sec->size = uncompressed_size; + sec->rawsize = save_rawsize; + sec->size = save_size; sec->compress_status = DECOMPRESS_SECTION_SIZED; if (!ret) goto fail_compressed; - uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size); - if (uncompressed_buffer == NULL) + if (p == NULL) + p = (bfd_byte *) bfd_malloc (sz); + if (p == NULL) goto fail_compressed; - if (!decompress_contents (compressed_buffer, compressed_size, - uncompressed_buffer, uncompressed_size)) + if (!decompress_contents (compressed_buffer, sec->compressed_size, p, sz)) { bfd_set_error (bfd_error_bad_value); - free (uncompressed_buffer); + if (p != *ptr) + free (p); fail_compressed: free (compressed_buffer); return FALSE; } free (compressed_buffer); - sec->contents = uncompressed_buffer; - sec->compress_status = COMPRESS_SECTION_DONE; - /* Fall thru */ + *ptr = p; + return TRUE; #endif case COMPRESS_SECTION_DONE: |