aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2014-10-14 13:36:20 +1030
committerAlan Modra <amodra@gmail.com>2014-10-14 14:36:35 +1030
commit65879393f04e14a9ab8797a8e66e0ec8d94108b5 (patch)
tree7f4300ec569ff44c6fd1c412f4ddad82d040477c /binutils
parent9495b2e66f772783eb89cfa755e1e09641fa44eb (diff)
downloadgdb-65879393f04e14a9ab8797a8e66e0ec8d94108b5.zip
gdb-65879393f04e14a9ab8797a8e66e0ec8d94108b5.tar.gz
gdb-65879393f04e14a9ab8797a8e66e0ec8d94108b5.tar.bz2
Avoid undefined behaviour with signed expressions
PR 17453 bfd/ * libbfd.c (COERCE16, COERCE32, COERCE64): Use unsigned types. (EIGHT_GAZILLION): Delete. binutils/ * dwarf.c (read_leb128): Avoid signed overflow. (read_debug_line_header): Likewise. gas/ * config/tc-i386.c (fits_in_signed_long): Use unsigned param and expression to avoid signed overflow. (fits_in_signed_byte, fits_in_unsigned_byte, fits_in_unsigned_word, fits_in_signed_word, fits_in_unsigned_long): Similarly. * expr.c (operand <'-'>): Avoid signed overflow. * read.c (s_comm_internal): Likewise.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog6
-rw-r--r--binutils/dwarf.c8
2 files changed, 8 insertions, 6 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index b6800f1..0b297cb 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,6 +1,12 @@
2014-10-14 Alan Modra <amodra@gmail.com>
PR 17453
+ * dwarf.c (read_leb128): Avoid signed overflow.
+ (read_debug_line_header): Likewise.
+
+2014-10-14 Alan Modra <amodra@gmail.com>
+
+ PR 17453
* readelf.c (process_program_headers): Correct fscanf format used
for interpreter.
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 3f4095a..ee982de 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -259,7 +259,7 @@ read_leb128 (unsigned char *data,
*length_return = num_read;
if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
- result |= -1L << shift;
+ result |= (dwarf_vma) -1 << shift;
return result;
}
@@ -2661,14 +2661,10 @@ read_debug_line_header (struct dwarf_section * section,
linfo->li_max_ops_per_insn = 1;
SAFE_BYTE_GET_AND_INC (linfo->li_default_is_stmt, hdrptr, 1, end);
- SAFE_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
+ SAFE_SIGNED_BYTE_GET_AND_INC (linfo->li_line_base, hdrptr, 1, end);
SAFE_BYTE_GET_AND_INC (linfo->li_line_range, hdrptr, 1, end);
SAFE_BYTE_GET_AND_INC (linfo->li_opcode_base, hdrptr, 1, end);
- /* Sign extend the line base field. */
- linfo->li_line_base <<= 24;
- linfo->li_line_base >>= 24;
-
* end_of_sequence = data + linfo->li_length + initial_length_size;
return hdrptr;
}