+2020-12-15 Alan Modra <amodra@gmail.com>
+
+ 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.
+
2020-12-14 Alan Modra <amodra@gmail.com>
* testsuite/gas/elf/section27.s: Reorder .text, .data and .bss
#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. */
#endif
elf_obj_read_begin_hook,
elf_obj_symbol_new_hook,
- 0,
+ elf_obj_symbol_clone_hook,
elf_adjust_symtab
};
#define obj_symbol_new_hook elf_obj_symbol_new_hook
#endif
+void elf_obj_symbol_clone_hook (symbolS *, symbolS *);
+#ifndef obj_symbol_clone_hook
+#define obj_symbol_clone_hook elf_obj_symbol_clone_hook
+#endif
+
void elf_copy_symbol_attributes (symbolS *, symbolS *);
#ifndef OBJ_COPY_SYMBOL_ATTRIBUTES
#define OBJ_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \
fseek (last_open_file, file->pos, SEEK_SET);
}
- /* Leave room for null. */
- size -= 1;
-
c = fgetc (last_open_file);
while (c != EOF && c != '\n' && c != '\r')
{
- if (count < size)
+ if (++count < size)
*p++ = c;
- count++;
-
c = fgetc (last_open_file);
}
if (c == EOF)
{
file->at_end = 1;
- if (count + 2 < size)
+ if (count + 3 < size)
{
*p++ = '.';
*p++ = '.';