summaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2008-05-10 01:58:17 +0000
committerAlan Modra <amodra@bigpond.net.au>2008-05-10 01:58:17 +0000
commitb533533ec4d7480880aff95a3863c8e46c539a7e (patch)
tree919b827de40eecad47b27ddf37c21a65c09fc65e /bfd
parent2a03fa7a39f2d63322fe349e34924d31a91f8346 (diff)
downloadbinutils-redhat-b533533ec4d7480880aff95a3863c8e46c539a7e.tar.gz
* elfcore.h (elf_core_file_p): Warn about core truncation.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog4
-rw-r--r--bfd/elfcore.h30
2 files changed, 32 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0e1ce2cda6..0949d1570a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,7 @@
+2008-05-10 Paul Pluzhnikov <ppluzhnikov@google.com>
+
+ * elfcore.h (elf_core_file_p): Warn about core truncation.
+
2008-05-07 Bob Wilson <bob.wilson@acm.org>
* elf32-xtensa.c (xtensa_property_section_name): New.
diff --git a/bfd/elfcore.h b/bfd/elfcore.h
index dbf9397572..9c51422624 100644
--- a/bfd/elfcore.h
+++ b/bfd/elfcore.h
@@ -1,6 +1,6 @@
/* ELF core file support for BFD.
- Copyright 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2007
- Free Software Foundation, Inc.
+ Copyright 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2007,
+ 2008 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@@ -227,6 +227,32 @@ elf_core_file_p (bfd *abfd)
if (! bfd_section_from_phdr (abfd, i_phdrp + phindex, (int) phindex))
goto fail;
+ /* Check for core truncation. */
+ {
+ bfd_size_type high = 0;
+ struct stat statbuf;
+ for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
+ {
+ Elf_Internal_Phdr *p = i_phdrp + phindex;
+ if (p->p_filesz)
+ {
+ bfd_size_type current = p->p_offset + p->p_filesz;
+ if (high < current)
+ high = current;
+ }
+ }
+ if (bfd_stat (abfd, &statbuf) == 0)
+ {
+ if ((bfd_size_type) statbuf.st_size < high)
+ {
+ (*_bfd_error_handler)
+ (_("Warning: %B is truncated: expected core file "
+ "size >= %lu, found: %lu."),
+ abfd, (unsigned long) high, (unsigned long) statbuf.st_size);
+ }
+ }
+ }
+
/* Save the entry point from the ELF header. */
bfd_get_start_address (abfd) = i_ehdrp->e_entry;