Browse Source

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

operation.  Add sanity checks.
gdb_7_6-branch
Nick Clifton 14 years ago
parent
commit
9b239e0e1f
  1. 6
      bfd/ChangeLog
  2. 42
      bfd/elflink.c

6
bfd/ChangeLog

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

42
bfd/elflink.c

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

Loading…
Cancel
Save