2010-06-09 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Wed, 9 Jun 2010 13:28:31 +0000 (13:28 +0000)
committerTristan Gingold <gingold@adacore.com>
Wed, 9 Jun 2010 13:28:31 +0000 (13:28 +0000)
* bfdio.c (bfd_bread): Fix the code to prevent reading past the
end of archive members.

bfd/ChangeLog
bfd/bfdio.c

index 6c4e8ca9b23c1b57f65997fa58fb805ab2d6fa36..ea74ef9f45f71f90b2759d5fb22d031bcd746a5f 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-09 Tristan Gingold  <gingold@adacore.com>
+
+       * bfdio.c (bfd_bread): Fix the code to prevent reading past the
+       end of archive members.
+
 2010-06-08  Tristan Gingold  <gingold@adacore.com>
 
        * som.c (som_bfd_free_cached_info): Do not free relocations as
index 4c13a767384add1ee9dbf7fe8d5b3b9d39a663c7..ce92781d505a8f4ee0c5efb16232b71119cfc4e8 100644 (file)
@@ -180,8 +180,12 @@ bfd_bread (void *ptr, bfd_size_type size, bfd *abfd)
   if (abfd->arelt_data != NULL)
     {
       size_t maxbytes = ((struct areltdata *) abfd->arelt_data)->parsed_size;
-      if (size > maxbytes)
-       size = maxbytes;
+      if (abfd->where + size > maxbytes)
+        {
+          if (abfd->where >= maxbytes)
+            return 0;
+          size = maxbytes - abfd->where;
+        }
     }
 
   if (abfd->iovec)