aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2018-09-18 16:54:07 +0100
committerNick Clifton <nickc@redhat.com>2018-09-18 16:54:07 +0100
commit8ff71a9c80cfcf64c54d4ae938c644b1b1ea19fb (patch)
tree1faaa4477fe479f69c256382b9c20467978a442f /bfd
parent3ff2c72e14b7f4381c785ee35608c2812ef8610e (diff)
downloadgdb-8ff71a9c80cfcf64c54d4ae938c644b1b1ea19fb.zip
gdb-8ff71a9c80cfcf64c54d4ae938c644b1b1ea19fb.tar.gz
gdb-8ff71a9c80cfcf64c54d4ae938c644b1b1ea19fb.tar.bz2
Add a warning to the bfd library for when it encounters an ELF file with an invalid section size.
PR 23657 * elfcode.h (elf_swap_shdr_in): Generate a warning message if an ELF section has contents and size larger than the file size.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elfcode.h8
2 files changed, 14 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 70de004..04c0c2a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2018-09-18 Nick Clifton <nickc@redhat.com>
+
+ PR 23657
+ * elfcode.h (elf_swap_shdr_in): Generate a warning message if an
+ ELF section has contents and size larger than the file size.
+
2018-09-14 Maciej W. Rozycki <macro@mips.com>
PR ld/21375
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index fb02e25..f224c8b 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -314,6 +314,14 @@ elf_swap_shdr_in (bfd *abfd,
dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
dst->sh_size = H_GET_WORD (abfd, src->sh_size);
+ /* PR 23657. Check for invalid section size, in sections with contents.
+ Note - we do not set an error value here because the contents
+ of this particular section might not be needed by the consumer. */
+ if (dst->sh_type != SHT_NOBITS
+ && dst->sh_size > bfd_get_file_size (abfd))
+ _bfd_error_handler
+ (_("warning: %pB has a corrupt section with a size (%" BFD_VMA_FMT "x) larger than the file size"),
+ abfd, dst->sh_size);
dst->sh_link = H_GET_32 (abfd, src->sh_link);
dst->sh_info = H_GET_32 (abfd, src->sh_info);
dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);