summaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2014-04-30 17:04:04 +0100
committerNick Clifton <nickc@redhat.com>2014-04-30 17:04:04 +0100
commita953eec996f2f93914cc78d68d4478a2660432b6 (patch)
treecfee3d9c40c75de51ab05c29e44fb241dcc836da /bfd
parent1cfdf5340af6f07bb44b97c278f7036ef8db5c43 (diff)
downloadbinutils-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/ChangeLog6
-rw-r--r--bfd/compress.c10
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;