PR 3704
authorAlan Modra <amodra@gmail.com>
Thu, 14 Dec 2006 02:59:25 +0000 (02:59 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 14 Dec 2006 02:59:25 +0000 (02:59 +0000)
* bfdio.c (bfd_bread): Don't read past end of archive elements.

bfd/ChangeLog
bfd/bfdio.c

index 4a5528633b373a0b57c495bf01c8b444fa5851b5..f15fdd35677ad9470ba504daccf1416d8ca16ca3 100644 (file)
@@ -1,3 +1,8 @@
+2006-12-14  Alan Modra  <amodra@bigpond.net.au>
+
+       PR 3704
+       * bfdio.c (bfd_bread): Don't read past end of archive elements.
+
 2006-12-12  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * doc/Makefile.am (bfd_TEXINFOS): Set.
index 0aa82a9d2e2aedef7684b88d937334ae60a8fe7f..0c720f61b07cfca4981fffdea39afbf4107d231f 100644 (file)
@@ -1,7 +1,7 @@
 /* Low-level I/O routines for BFDs.
 
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
    Free Software Foundation, Inc.
 
    Written by Cygnus Support.
@@ -116,6 +116,15 @@ bfd_bread (void *ptr, bfd_size_type size, bfd *abfd)
 {
   size_t nread;
 
+  /* If this is an archive element, don't read past the end of
+     this element.  */
+  if (abfd->arelt_data != NULL)
+    {
+      size_t maxbytes = ((struct areltdata *) abfd->arelt_data)->parsed_size;
+      if (size > maxbytes)
+       size = maxbytes;
+    }
+
   if ((abfd->flags & BFD_IN_MEMORY) != 0)
     {
       struct bfd_in_memory *bim;