diff options
author | Alan Modra <amodra@gmail.com> | 2014-10-14 13:36:20 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2014-10-14 14:36:35 +1030 |
commit | 65879393f04e14a9ab8797a8e66e0ec8d94108b5 (patch) | |
tree | 7f4300ec569ff44c6fd1c412f4ddad82d040477c /binutils | |
parent | 9495b2e66f772783eb89cfa755e1e09641fa44eb (diff) | |
download | gdb-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/ChangeLog | 6 | ||||
-rw-r--r-- | binutils/dwarf.c | 8 |
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; } |