* elfcore.h (elf_core_file_p): Warn about core truncation.
authorAlan Modra <amodra@gmail.com>
Sat, 10 May 2008 01:58:17 +0000 (01:58 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 10 May 2008 01:58:17 +0000 (01:58 +0000)
bfd/ChangeLog
bfd/elfcore.h

index 0e1ce2cda6cab33d1d31233b1db0dcc231ec2cf9..0949d1570a6c8a9a0663c9b73beb268497cec413 100644 (file)
@@ -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.
index dbf939757283a13ad3afb9588e5b63c1f5c2e8db..9c51422624da37024320b5e45776992afd490a9e 100644 (file)
@@ -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;