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.
This commit is contained in:
Nick Clifton 2017-07-19 16:14:02 +01:00
parent 909e4e716c
commit 6c4e7b6bfb
2 changed files with 45 additions and 1 deletions

View File

@ -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>

View File

@ -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;