* elflink.c (get_value): Prevent the use of an undefined shift

operation.  Add sanity checks.
This commit is contained in:
Nick Clifton 2013-01-03 15:47:46 +00:00
parent 50da2f2530
commit 9b239e0e1f
2 changed files with 36 additions and 12 deletions

View File

@ -1,3 +1,9 @@
2013-01-03 Nickolai Zeldovich <nickolai@csail.mit.edu>
Nick Clifton <nickc@redhat.com>
* elflink.c (get_value): Prevent the use of an undefined shift
operation. Add sanity checks.
2013-01-02 Kaushik Phatak <kaushik.phatak@kpitcummins.com>
* config.bfd (cr16*-*-uclinux*): New target support.

View File

@ -1,6 +1,6 @@
/* ELF linking support for BFD.
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -7917,31 +7917,49 @@ get_value (bfd_vma size,
bfd *input_bfd,
bfd_byte *location)
{
int shift;
bfd_vma x = 0;
/* Sanity checks. */
BFD_ASSERT (chunksz <= sizeof (x)
&& size >= chunksz
&& chunksz != 0
&& (size % chunksz) == 0
&& input_bfd != NULL
&& location != NULL);
if (chunksz == sizeof (x))
{
BFD_ASSERT (size == chunksz);
/* Make sure that we do not perform an undefined shift operation.
We know that size == chunksz so there will only be one iteration
of the loop below. */
shift = 0;
}
else
shift = 8 * chunksz;
for (; size; size -= chunksz, location += chunksz)
{
switch (chunksz)
{
default:
case 0:
abort ();
case 1:
x = (x << (8 * chunksz)) | bfd_get_8 (input_bfd, location);
x = (x << shift) | bfd_get_8 (input_bfd, location);
break;
case 2:
x = (x << (8 * chunksz)) | bfd_get_16 (input_bfd, location);
x = (x << shift) | bfd_get_16 (input_bfd, location);
break;
case 4:
x = (x << (8 * chunksz)) | bfd_get_32 (input_bfd, location);
x = (x << shift) | bfd_get_32 (input_bfd, location);
break;
case 8:
#ifdef BFD64
x = (x << (8 * chunksz)) | bfd_get_64 (input_bfd, location);
#else
abort ();
#endif
case 8:
x = (x << shift) | bfd_get_64 (input_bfd, location);
break;
#endif
default:
abort ();
}
}
return x;