aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2010-12-24 10:40:19 +0000
committerAlan Modra <amodra@gmail.com>2010-12-24 10:40:19 +0000
commit82c6068aa475aa4e3fdb15cb5dfb1a297e64d764 (patch)
tree58f39acff498948ea5694f103c1385b4ed67b4cd /bfd
parent76136a3cde266dbc2a55e9291f1fd6327987459d (diff)
downloadgdb-82c6068aa475aa4e3fdb15cb5dfb1a297e64d764.zip
gdb-82c6068aa475aa4e3fdb15cb5dfb1a297e64d764.tar.gz
gdb-82c6068aa475aa4e3fdb15cb5dfb1a297e64d764.tar.bz2
* compress.c (decompress_contents): Style.
(bfd_get_full_section_contents): Do not decompress directly into caller buffer or directly return cached section contents. Check malloc return for compressed_buffer.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/compress.c127
2 files changed, 65 insertions, 69 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 7b8ca30..bf39613 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2010-12-24 Alan Modra <amodra@gmail.com>
+
+ * compress.c (decompress_contents): Style.
+ (bfd_get_full_section_contents): Do not decompress directly into
+ caller buffer or directly return cached section contents.
+ Check malloc return for compressed_buffer.
+
2010-12-21 Kai Tietz <kai.tietz@onevision.com>
* peXXigen.c (_bfd_XXi_final_link_postscript): Use
diff --git a/bfd/compress.c b/bfd/compress.c
index bdaa3c4..a526ea9 100644
--- a/bfd/compress.c
+++ b/bfd/compress.c
@@ -59,7 +59,7 @@ decompress_contents (bfd_byte *compressed_buffer,
rc = inflateReset (&strm);
}
rc = inflateEnd (&strm);
- return rc != Z_OK || strm.avail_out != 0 ? FALSE: TRUE;
+ return rc == Z_OK && strm.avail_out == 0;
}
#endif
@@ -157,8 +157,8 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
{
bfd_size_type sz = sec->rawsize ? sec->rawsize : sec->size;
bfd_byte *p = *ptr;
- bfd_boolean need_free, ret;
#ifdef HAVE_ZLIB_H
+ bfd_boolean ret;
bfd_size_type compressed_size;
bfd_size_type uncompressed_size;
bfd_size_type rawsize;
@@ -177,88 +177,77 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
p = (bfd_byte *) bfd_malloc (sz);
if (p == NULL)
return FALSE;
- need_free = TRUE;
- *ptr = p;
}
- else
- need_free = FALSE;
- ret = bfd_get_section_contents (abfd, sec, p, 0, sz);
- if (!ret && need_free)
- free (p);
- return ret;
-
- case COMPRESS_SECTION_DONE:
- if (p)
- memcpy (p, sec->contents, sz);
- else
- *ptr = sec->contents;
+ if (!bfd_get_section_contents (abfd, sec, p, 0, sz))
+ {
+ if (*ptr != p)
+ free (p);
+ return FALSE;
+ }
+ *ptr = p;
return TRUE;
case DECOMPRESS_SECTION_SIZED:
- break;
-
- default:
- abort ();
- }
-
#ifndef HAVE_ZLIB_H
- bfd_set_error (bfd_error_invalid_operation);
- return FALSE;
+ bfd_set_error (bfd_error_invalid_operation);
+ 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);
- rawsize = sec->rawsize;
- /* 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->compress_status = COMPRESS_SECTION_NONE;
- ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
- 0, compressed_size);
- /* Restore rawsize and size. */
- sec->rawsize = rawsize;
- sec->size = uncompressed_size;
- if (!ret)
- {
-fail_compressed:
+ /* Read in the full compressed section contents. */
+ uncompressed_size = sec->size;
+ compressed_size = sec->compressed_size;
+ compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size);
+ if (compressed_buffer == NULL)
+ return FALSE;
+ rawsize = sec->rawsize;
+ /* 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->compress_status = COMPRESS_SECTION_NONE;
+ ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
+ 0, compressed_size);
+ /* Restore rawsize and size. */
+ sec->rawsize = rawsize;
+ sec->size = uncompressed_size;
sec->compress_status = DECOMPRESS_SECTION_SIZED;
- free (compressed_buffer);
- return ret;
- }
+ if (!ret)
+ goto fail_compressed;
- /* Decompress to caller buffer directly if it is provided. */
- if (p)
- uncompressed_buffer = p;
- else
- {
uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
if (uncompressed_buffer == NULL)
goto fail_compressed;
- }
- if (!decompress_contents (compressed_buffer, compressed_size,
- uncompressed_buffer, uncompressed_size))
- {
- sec->compress_status = DECOMPRESS_SECTION_SIZED;
- free (compressed_buffer);
- if (p == NULL)
- free (uncompressed_buffer);
- bfd_set_error (bfd_error_bad_value);
- return FALSE;
- }
+ if (!decompress_contents (compressed_buffer, compressed_size,
+ uncompressed_buffer, uncompressed_size))
+ {
+ bfd_set_error (bfd_error_bad_value);
+ free (uncompressed_buffer);
+ fail_compressed:
+ free (compressed_buffer);
+ return FALSE;
+ }
- free (compressed_buffer);
- if (p == NULL)
- *ptr = uncompressed_buffer;
+ free (compressed_buffer);
+ sec->contents = uncompressed_buffer;
+ sec->compress_status = COMPRESS_SECTION_DONE;
+ /* Fall thru */
+#endif
- sec->contents = uncompressed_buffer;
- sec->compress_status = COMPRESS_SECTION_DONE;
+ case COMPRESS_SECTION_DONE:
+ if (p == NULL)
+ {
+ p = (bfd_byte *) bfd_malloc (sz);
+ if (p == NULL)
+ return FALSE;
+ *ptr = p;
+ }
+ memcpy (p, sec->contents, sz);
+ return TRUE;
- return TRUE;
-#endif
+ default:
+ abort ();
+ }
}
/*