aboutsummaryrefslogtreecommitdiff
path: root/gas/config/obj-elf.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-12-15 21:54:09 +1030
committerAlan Modra <amodra@gmail.com>2020-12-16 01:13:58 +1030
commit7bed846687589e1346626e8bc9f2948340ef454b (patch)
tree4b656167da9efec90ae7711faf78e32f36762099 /gas/config/obj-elf.c
parent9f132af9e189a6c1e90b1ab7ed84c6613c8ac596 (diff)
downloadfsf-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.c18
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
};