From 8f02ae5bac22b8d7f57f233ca1957ef9dbe751ab Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 15 May 2019 11:24:09 +0930 Subject: [PATCH] .file file number checking This adds another test for file numbers given in .file directives, checking that the value can be represented as an unsigned int and that a memory allocation expression doesn't overflow. I removed a test added recently since an earlier test (num < 1) already covers the (num < 0) case. * dwarf2dbg.c: Whitespace fixes. (get_filenum): Don't strdup "file". Adjust error message. (dwarf2_directive_filename): Use an unsigned type for "num". Catch truncation of file number and overflow of get_filenum XRESIZEVEC multiplication. Delete dead code. --- gas/ChangeLog | 26 +++++++++++++++++--------- gas/dwarf2dbg.c | 27 ++++++++++++++------------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index bcece779a3b..be6938429e5 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2019-05-15 Alan Modra + + * dwarf2dbg.c: Whitespace fixes. + (get_filenum): Don't strdup "file". Adjust error message. + (dwarf2_directive_filename): Use an unsigned type for "num". + Catch truncation of file number and overflow of get_filenum + XRESIZEVEC multiplication. Delete dead code. + 2019-05-15 Alan Modra PR 24538 @@ -256,7 +264,7 @@ 2019-04-29 John Darrington - * testsuite/gas/s12z/truncated.d: New file. + * testsuite/gas/s12z/truncated.d: New file. * testsuite/gas/s12z/truncated.s: New file. * testsuite/gas/s12z/s12z.exp: Add new test. @@ -509,7 +517,7 @@ * testsuite/gas/arm/archv8m_1m-cmse-main.s: Likewise. 2019-04-15 Sudakshina Das - Andre Vieira + Andre Vieira * config/tc-arm.c (operand_parse_code): Add OP_LR and OP_oLR for the LR operand and optional LR operand. @@ -531,7 +539,7 @@ * testsuite/gas/arm/armv8_1-m-tloop-bad.l: New. 2019-04-15 Sudakshina Das - Andre Vieira + Andre Vieira * config/tc-arm.c (T16_32_TAB): New entriy for bfcsel. (do_t_v8_1_branch): New switch case for bfcsel. @@ -552,7 +560,7 @@ (tc_gen_reloc): Likewise. 2019-04-15 Sudakshina Das - Andre Vieira + Andre Vieira * config/tc-arm.c (T16_32_TAB): New entrie for bfl. (do_t_v8_1_branch): New switch case for bfl. @@ -584,7 +592,7 @@ * testsuite/gas/arm/armv8_1-m-bf-exchange-bad.d: New 2019-04-15 Sudakshina Das - Andre Vieira + Andre Vieira * config/tc-arm.c (T16_32_TAB): New entries for bf. (do_t_branch_future): New. @@ -660,11 +668,11 @@ * testsuite/gas/mips/mips.exp: Run the new test. 2019-04-12 John Darrington - + config/tc-s12z.h: Remove definition of macro TC_M68K 2019-04-01 John Darrington - + config/tc-s12z.c: Use bfd_boolean where appropriate. 2019-04-11 Max Filippov @@ -1292,7 +1300,7 @@ 2019-01-31 John Darrington - * config/tc-s12z.c (lex_imm): Add new argument exp_o. + * config/tc-s12z.c (lex_imm): Add new argument exp_o. (emit_reloc): New function. (md_apply_fix): [BFD_RELOC_S12Z_OPR] Recognise that it can be either 2 bytes or 3 bytes long. @@ -1545,7 +1553,7 @@ 2019-01-09 John Darrington - * testsuite/gas/s12z/jsr.s: New case. + * testsuite/gas/s12z/jsr.s: New case. * testsuite/gas/s12z/jsr.d: New case. 2019-01-09 Andrew Paprocki diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index cc36957cb48..5f804f15413 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -754,7 +754,7 @@ get_filenum (const char *filename, unsigned int num) /* Catch wraparound. */ if (files_allocated <= old) { - as_bad (_("file number %u is too big"), i); + as_bad (_("file number %lu is too big"), (unsigned long) i); return 0; } @@ -762,7 +762,7 @@ get_filenum (const char *filename, unsigned int num) memset (files + old, 0, (i + 32 - old) * sizeof (struct file_entry)); } - files[i].filename = num ? file : xstrdup (file); + files[i].filename = file; files[i].dir = dir; if (files_in_use < i + 1) files_in_use = i + 1; @@ -781,7 +781,7 @@ get_filenum (const char *filename, unsigned int num) char * dwarf2_directive_filename (void) { - offsetT num; + valueT num; char *filename; int filename_len; @@ -799,7 +799,7 @@ dwarf2_directive_filename (void) return NULL; demand_empty_rest_of_line (); - if (num < 1) + if ((offsetT) num < 1) { as_bad (_("file number less than one")); return NULL; @@ -809,14 +809,15 @@ dwarf2_directive_filename (void) being supplied. Turn off gas generated debug info. */ debug_type = DEBUG_NONE; - if (num < (offsetT) files_in_use && files[num].filename != 0) + if (num != (unsigned int) num + || num >= (size_t) -1 / sizeof (struct file_entry) - 32) { - as_bad (_("file number %ld already allocated"), (long) num); + as_bad (_("file number %lu is too big"), (unsigned long) num); return NULL; } - else if (num < 0) + if (num < files_in_use && files[num].filename != 0) { - as_bad (_("file number %ld is too small!"), (long) num); + as_bad (_("file number %u already allocated"), (unsigned int) num); return NULL; } @@ -1172,10 +1173,10 @@ scale_addr_delta (addressT *addr_delta) if (DWARF2_LINE_MIN_INSN_LENGTH > 1) { if (*addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0 && !printed_this) - { + { as_bad("unaligned opcodes detected in executable segment"); - printed_this = 1; - } + printed_this = 1; + } *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH; } } @@ -1750,10 +1751,10 @@ out_file_list (void) out_uleb128 (files[i].dir); /* directory number */ /* Output the last modification timestamp. */ out_uleb128 (DWARF2_FILE_TIME_NAME (files[i].filename, - files[i].dir ? dirs [files [i].dir] : "")); + files[i].dir ? dirs [files [i].dir] : "")); /* Output the filesize. */ out_uleb128 (DWARF2_FILE_SIZE_NAME (files[i].filename, - files[i].dir ? dirs [files [i].dir] : "")); + files[i].dir ? dirs [files [i].dir] : "")); } /* Terminate filename list. */ -- 2.30.2