diff options
author | Nick Clifton <nickc@redhat.com> | 2017-07-19 16:14:02 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2017-07-19 16:14:02 +0100 |
commit | 6c4e7b6bfbc4679f695106de2817ecf02b27c8be (patch) | |
tree | 4bae07ed89c9c374966ec95913308373f6c7a5a2 /bfd | |
parent | 909e4e716c4d77e33357bbe9bc902bfaf2e1af24 (diff) | |
download | gdb-6c4e7b6bfbc4679f695106de2817ecf02b27c8be.zip gdb-6c4e7b6bfbc4679f695106de2817ecf02b27c8be.tar.gz gdb-6c4e7b6bfbc4679f695106de2817ecf02b27c8be.tar.bz2 |
Extend previous fix to coff-rs6000.c to coff64-rs6000.c
PR 21786
* coff64-rs6000.c (_bfd_strntol): New function.
(_bfd_strntoll): New function.
(GET_VALUE_IN_FIELD): New macro.
(xcoff64_slurp_armap): Use new macros.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 4 | ||||
-rw-r--r-- | bfd/coff64-rs6000.c | 42 |
2 files changed, 45 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cc7f45c..6f4a5b3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -17,6 +17,10 @@ (_bfd_xcoff_read_ar_hdr): Likewise. (_bfd_xcoff_openr_next_archived_file): Likewise. (_bfd_xcoff_stat_arch_elt): Likewise. + * coff64-rs6000.c (_bfd_strntol): New function. + (_bfd_strntoll): New function. + (GET_VALUE_IN_FIELD): New macro. + (xcoff64_slurp_armap): Use new macros. 2017-07-19 Claudiu Zissulescu <claziss@synopsys.com> John Eric Martin <John.Martin@emmicro-us.com> diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 525b079..460bf49 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -1852,6 +1852,46 @@ xcoff64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, return NULL; } +/* PR 21786: The PE/COFF standard does not require NUL termination for any of + the ASCII fields in the archive headers. So in order to be able to extract + numerical values we provide our own versions of strtol and strtoll which + take a maximum length as an additional parameter. Also - just to save space, + we omit the endptr return parameter, since we know that it is never used. */ + +static long +_bfd_strntol (const char * nptr, int base, unsigned int maxlen) +{ + char buf[24]; /* Should be enough. */ + + BFD_ASSERT (maxlen < (sizeof (buf) - 1)); + + memcpy (buf, nptr, maxlen); + buf[maxlen] = 0; + return strtol (buf, NULL, base); +} + +static long long +_bfd_strntoll (const char * nptr, int base, unsigned int maxlen) +{ + char buf[32]; /* Should be enough. */ + + BFD_ASSERT (maxlen < (sizeof (buf) - 1)); + + memcpy (buf, nptr, maxlen); + buf[maxlen] = 0; + return strtoll (buf, NULL, base); +} + +/* Macro to read an ASCII value stored in an archive header field. */ +#define GET_VALUE_IN_FIELD(VAR, FIELD) \ + do \ + { \ + (VAR) = sizeof (VAR) > sizeof (long) \ + ? _bfd_strntoll (FIELD, 10, sizeof FIELD) \ + : _bfd_strntol (FIELD, 10, sizeof FIELD); \ + } \ + while (0) + /* Read in the armap of an XCOFF archive. */ static bfd_boolean @@ -1892,7 +1932,7 @@ xcoff64_slurp_armap (bfd *abfd) return FALSE; /* Skip the name (normally empty). */ - namlen = strtol (hdr.namlen, (char **) NULL, 10); + GET_VALUE_IN_FIELD (namlen, hdr.namlen); pos = ((namlen + 1) & ~(size_t) 1) + SXCOFFARFMAG; if (bfd_seek (abfd, pos, SEEK_CUR) != 0) return FALSE; |