diff options
author | Alan Modra <amodra@gmail.com> | 2020-12-15 21:54:09 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-12-16 01:13:58 +1030 |
commit | 7bed846687589e1346626e8bc9f2948340ef454b (patch) | |
tree | 4b656167da9efec90ae7711faf78e32f36762099 /gas/config/obj-elf.c | |
parent | 9f132af9e189a6c1e90b1ab7ed84c6613c8ac596 (diff) | |
download | fsf-binutils-gdb-7bed846687589e1346626e8bc9f2948340ef454b.zip fsf-binutils-gdb-7bed846687589e1346626e8bc9f2948340ef454b.tar.gz fsf-binutils-gdb-7bed846687589e1346626e8bc9f2948340ef454b.tar.bz2 |
PR27071, gas bugs uncovered by fuzzing
PR 27071
* config/obj-elf.c (elf_obj_symbol_clone_hook): New function.
(elf_format_ops): Set symbol_clone_hook.
* config/obj-elf.h (elf_obj_symbol_clone_hook): Declare.
(obj_symbol_clone_hook): Define.
* listing.c (buffer_line): Avoid integer overflow on paper_width
set to zero.
Diffstat (limited to 'gas/config/obj-elf.c')
-rw-r--r-- | gas/config/obj-elf.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 5d3b1a0..bee95c3 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -2102,6 +2102,22 @@ elf_obj_symbol_new_hook (symbolS *symbolP) #endif } +/* Deduplicate size expressions. We might get into trouble with + multiple freeing or use after free if we leave them pointing to the + same expressionS. */ + +void +elf_obj_symbol_clone_hook (symbolS *newsym, symbolS *orgsym ATTRIBUTE_UNUSED) +{ + struct elf_obj_sy *newelf = symbol_get_obj (newsym); + if (newelf->size) + { + expressionS *exp = XNEW (expressionS); + *exp = *newelf->size; + newelf->size = exp; + } +} + /* When setting one symbol equal to another, by default we probably want them to have the same "size", whatever it means in the current context. */ @@ -3088,6 +3104,6 @@ const struct format_ops elf_format_ops = #endif elf_obj_read_begin_hook, elf_obj_symbol_new_hook, - 0, + elf_obj_symbol_clone_hook, elf_adjust_symtab }; |