X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fcoff64-rs6000.c;fp=bfd%2Fcoff64-rs6000.c;h=4db61e5706428d22d0e2c67795b599bbd1dbafe6;hb=228c8f4be0c428369ec6b68e25696863d1e62ed7;hp=091da1fd5e81e5fa5a1480221b1e12deaffe5e82;hpb=f00901886d0acb7a4d4b177a5cabe8bd9ca2307b;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 091da1fd5e..4db61e5706 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -1933,18 +1933,27 @@ xcoff64_slurp_armap (bfd *abfd) return FALSE; sz = bfd_scan_vma (hdr.size, (const char **) NULL, 10); + if (sz == (bfd_size_type) -1) + { + bfd_set_error (bfd_error_no_memory); + return FALSE; + } /* Read in the entire symbol table. */ - contents = (bfd_byte *) bfd_alloc (abfd, sz); + contents = (bfd_byte *) bfd_alloc (abfd, sz + 1); if (contents == NULL) return FALSE; if (bfd_bread (contents, sz, abfd) != sz) return FALSE; + /* Ensure strings are NULL terminated so we don't wander off the end + of the buffer. */ + contents[sz] = 0; + /* The symbol table starts with an eight byte count. */ c = H_GET_64 (abfd, contents); - if (c * 8 >= sz) + if (c >= sz / 8) { bfd_set_error (bfd_error_bad_value); return FALSE;