diff options
author | Nick Clifton <nickc@redhat.com> | 2014-04-30 17:04:04 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2014-04-30 17:04:04 +0100 |
commit | a953eec996f2f93914cc78d68d4478a2660432b6 (patch) | |
tree | cfee3d9c40c75de51ab05c29e44fb241dcc836da /bfd | |
parent | 1cfdf5340af6f07bb44b97c278f7036ef8db5c43 (diff) | |
download | binutils-gdb-a953eec996f2f93914cc78d68d4478a2660432b6.tar.gz |
Fixes a problem with the BFD library running out of memory because it mistakenly
thought that an uncompressed .debug_str section was compressed.
* compress.c (bfd_is_section_compressed): When checking the
.debug_str section, also check the fifth byte in the section is
not part of a string.
* binutils-all/debug_str.s: New test.
* binutils-all/debug_str.d: New test control file.
* binutils-all/compress.exp: Run debug_str test.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/compress.c | 10 |
2 files changed, 16 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4a4d3cf24aa..414ebab6398 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2014-04-30 Nick Clifton <nickc@redhat.com> + + * compress.c (bfd_is_section_compressed): When checking the + .debug_str section, also check the fifth byte in the section is + not part of a string. + 2014-04-30 Alan Modra <amodra@gmail.com> * elf-eh-frame.c (struct cie.personality): Replace val with sym. diff --git a/bfd/compress.c b/bfd/compress.c index 5a289e62e80..20eef952826 100644 --- a/bfd/compress.c +++ b/bfd/compress.c @@ -24,6 +24,7 @@ #ifdef HAVE_ZLIB_H #include <zlib.h> #endif +#include "safe-ctype.h" #ifdef HAVE_ZLIB_H static bfd_boolean @@ -303,6 +304,15 @@ bfd_is_section_compressed (bfd *abfd, sec_ptr sec) compressed = (bfd_get_section_contents (abfd, sec, compressed_buffer, 0, 12) && CONST_STRNEQ ((char*) compressed_buffer, "ZLIB")); + /* Check for the pathalogical case of a debug string section that + contains the string ZLIB.... as the first entry. We assume that + no uncompressed .debug_str section would ever be big enough to + have the first byte of its (big-endian) size be non-zero. */ + if (compressed + && strcmp (sec->name, ".debug_str") == 0 + && ISPRINT (compressed_buffer[4])) + compressed = FALSE; + /* Restore compress_status. */ sec->compress_status = saved; return compressed; |