From 1b7e3d2fb7036ce6f9d74e32dc052518f5cd45b6 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 3 Feb 2017 09:04:21 +0000 Subject: [PATCH] Fix compile time warning messages when compiling binutils with gcc 7.0.1. PR 21096 bfd * coffcode.h (coff_write_object_contents): Enlarge size of s_name_buf in order to avoid compile time warning about possible integer truncation. * elf32-nds32.c (nds32_elf_ex9_import_table): Mask off lower 32-bits of insn value before printing into buffer. opcodes * aarch64-opc.c (print_register_list): Ensure that the register list index will fir into the tb buffer. (print_register_offset_address): Likewise. * tic6x-dis.c (print_insn_tic6x): Increase size of func_unit_buf. --- bfd/ChangeLog | 9 +++++++++ bfd/coffcode.h | 11 +++++++---- bfd/elf32-nds32.c | 4 ++-- opcodes/ChangeLog | 8 ++++++++ opcodes/aarch64-opc.c | 6 ++++-- opcodes/tic6x-dis.c | 7 ++++--- 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index bbd1200b62..3f9bbd192a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2017-02-03 Nick Clifton + + PR 21096 + * coffcode.h (coff_write_object_contents): Enlarge size of + s_name_buf in order to avoid compile time warning about possible + integer truncation. + * elf32-nds32.c (nds32_elf_ex9_import_table): Mask off lower + 32-bits of insn value before printing into buffer. + 2017-02-02 Maciej W. Rozycki * elfxx-mips.c (mips_elf_hash_sort_data): Add diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 2ef4e92533..975d249b70 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -3755,7 +3755,9 @@ coff_write_object_contents (bfd * abfd) NUL-terminated. We use a temporary buffer so that we can still sprintf all eight chars without splatting a terminating NUL over the first byte of the following member (s_paddr). */ - char s_name_buf[SCNNMLEN + 1]; + /* PR 21096: The +20 is to stop a bogus warning from gcc7 about + a possible buffer overflow. */ + char s_name_buf[SCNNMLEN + 1 + 20]; /* An inherent limitation of the /nnnnnnn notation used to indicate the offset of the long name in the string table is that we @@ -3770,9 +3772,10 @@ coff_write_object_contents (bfd * abfd) return FALSE; } - /* snprintf not strictly necessary now we've verified the value - has less than eight ASCII digits, but never mind. */ - snprintf (s_name_buf, SCNNMLEN + 1, "/%lu", (unsigned long) string_size); + /* We do not need to use snprintf here as we have already verfied + that string_size is not too big, plus we have an overlarge + buffer, just in case. */ + sprintf (s_name_buf, "/%lu", (unsigned long) string_size); /* Then strncpy takes care of any padding for us. */ strncpy (section.s_name, s_name_buf, SCNNMLEN); string_size += len + 1; diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c index a84a6fd78a..3d510a0d54 100644 --- a/bfd/elf32-nds32.c +++ b/bfd/elf32-nds32.c @@ -14949,7 +14949,6 @@ nds32_elf_ex9_import_table (struct bfd_link_info *info) { int num = 0; bfd_byte *contents; - unsigned long insn; FILE *ex9_import_file; int update_ex9_table; struct elf_nds32_link_hash_table *table; @@ -14963,6 +14962,7 @@ nds32_elf_ex9_import_table (struct bfd_link_info *info) /* Read instructions from the input file and build the list. */ while (!feof (ex9_import_file)) { + unsigned long insn; char *code; struct elf_nds32_insn_times_entry *ptr; size_t nread; @@ -14973,7 +14973,7 @@ nds32_elf_ex9_import_table (struct bfd_link_info *info) break; insn = bfd_getb32 (contents); code = bfd_malloc (sizeof (char) * 9); - snprintf (code, 9, "%08lx", insn); + snprintf (code, 9, "%08lx", (insn & 0xffffffff)); ptr = bfd_malloc (sizeof (struct elf_nds32_insn_times_entry)); ptr->string = code; ptr->order = num; diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 3070ad58fa..2185484ece 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,11 @@ +2017-02-03 Nick Clifton + + PR 21096 + * aarch64-opc.c (print_register_list): Ensure that the register + list index will fir into the tb buffer. + (print_register_offset_address): Likewise. + * tic6x-dis.c (print_insn_tic6x): Increase size of func_unit_buf. + 2017-01-27 Alexis Deruell PR 21056 diff --git a/opcodes/aarch64-opc.c b/opcodes/aarch64-opc.c index eea76c87da..314bcb4193 100644 --- a/opcodes/aarch64-opc.c +++ b/opcodes/aarch64-opc.c @@ -2865,7 +2865,8 @@ print_register_list (char *buf, size_t size, const aarch64_opnd_info *opnd, /* Prepare the index if any. */ if (opnd->reglist.has_index) - snprintf (tb, 8, "[%" PRIi64 "]", opnd->reglist.index); + /* PR 21096: The %100 is to silence a warning about possible truncation. */ + snprintf (tb, 8, "[%" PRIi64 "]", (opnd->reglist.index % 100)); else tb[0] = '\0'; @@ -2965,7 +2966,8 @@ print_register_offset_address (char *buf, size_t size, { if (print_amount_p) snprintf (tb, sizeof (tb), ", %s #%" PRIi64, shift_name, - opnd->shifter.amount); + /* PR 21096: The %100 is to silence a warning about possible truncation. */ + (opnd->shifter.amount % 100)); else snprintf (tb, sizeof (tb), ", %s", shift_name); } diff --git a/opcodes/tic6x-dis.c b/opcodes/tic6x-dis.c index 1a6f5757ce..48046b2df5 100644 --- a/opcodes/tic6x-dis.c +++ b/opcodes/tic6x-dis.c @@ -316,7 +316,7 @@ print_insn_tic6x (bfd_vma addr, struct disassemble_info *info) const char *parallel; const char *cond = ""; const char *func_unit; - char func_unit_buf[7]; + char func_unit_buf[8]; unsigned int func_unit_side = 0; unsigned int func_unit_data_side = 0; unsigned int func_unit_cross = 0; @@ -703,8 +703,9 @@ print_insn_tic6x (bfd_vma addr, struct disassemble_info *info) if (opc->flags & TIC6X_FLAG_INSN16_BSIDE && func_unit_side == 1) func_unit_cross = 1; - snprintf (func_unit_buf, 7, " .%c%u%s%s", func_unit_char, - func_unit_side, (func_unit_cross ? "X" : ""), data_str); + snprintf (func_unit_buf, sizeof func_unit_buf, " .%c%u%s%s", + func_unit_char, func_unit_side, + (func_unit_cross ? "X" : ""), data_str); func_unit = func_unit_buf; } -- 2.34.1