From e1fa0163505af867009ea73fc5f705162120e795 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 21 Mar 2016 16:31:46 +0000 Subject: Remove use of alloca. bfd * warning.m4 (GCC_WARN_CFLAGS): Add -Wstack-usage=262144 * configure: Regenerate. * elf32-m68hc1x.c (elf32_m68hc11_relocate_section): Replace use of alloca with call to xmalloc. * elf32-nds32.c: Likewise. * elf64-hppa.c: Likewise. * elfxx-mips.c: Likewise. * pef.c: Likewise. * pei-x86_64.c: Likewise. * som.c: Likewise. * xsym.c: Likewise. binutils * dlltool.c: Replace use of alloca with call to xmalloc. * dllwrap.c: Likewise. * nlmconv.c: Likewise. * objdump.c: Likewise. * resrc.c: Likewise. * winduni.c: Likewise. * configure: Regenerate. gas * atof-generic.c: Replace use of alloca with call to xmalloc. * cgen.c: Likewise. * dwarf2dbg.c: Likewise. * macro.c: Likewise. * remap.c: Likewise. * stabs.c: Likewise. * symbols.c: Likewise. * config/obj-elf.c: Likewise. * config/tc-aarch64.c: Likewise. * config/tc-arc.c: Likewise. * config/tc-arm.c: Likewise. * config/tc-avr.c: Likewise. * config/tc-ia64.c: Likewise. * config/tc-mips.c: Likewise. * config/tc-msp430.c: Likewise. * config/tc-nds32.c: Likewise. * config/tc-ppc.c: Likewise. * config/tc-sh.c: Likewise. * config/tc-tic30.c: Likewise. * config/tc-tic54x.c: Likewise. * config/tc-xstormy16.c: Likewise. * config/te-vms.c: Likewise. * configure: Regenerate. ld * emultempl/msp430.em: Replace use of alloca with call to xmalloc. * plugin.c: Likewise. * pe-dll.c: Likewise. --- bfd/ChangeLog | 14 +++++++++++ bfd/configure | 2 +- bfd/elf32-m68hc1x.c | 64 +++++++++++++++++++++-------------------------- bfd/elf32-nds32.c | 3 ++- bfd/elf64-hppa.c | 13 ++++------ bfd/elfxx-mips.c | 26 +++++++++++-------- bfd/pef.c | 3 ++- bfd/pei-x86_64.c | 3 ++- bfd/som.c | 24 ++++++++++-------- bfd/warning.m4 | 2 +- bfd/xsym.c | 5 +++- binutils/ChangeLog | 10 ++++++++ binutils/configure | 2 +- binutils/dlltool.c | 22 ++++++++-------- binutils/dllwrap.c | 3 ++- binutils/nlmconv.c | 4 ++- binutils/objdump.c | 13 +++++++--- binutils/resrc.c | 3 ++- binutils/winduni.c | 4 ++- gas/ChangeLog | 26 +++++++++++++++++++ gas/atof-generic.c | 17 ++++++++----- gas/cgen.c | 5 +++- gas/config/obj-elf.c | 9 ++++--- gas/config/tc-aarch64.c | 8 ++++-- gas/config/tc-arc.c | 9 +++---- gas/config/tc-arm.c | 22 +++++++++++----- gas/config/tc-avr.c | 15 +++++------ gas/config/tc-ia64.c | 34 ++++++++----------------- gas/config/tc-mips.c | 18 +++++++------ gas/config/tc-msp430.c | 2 +- gas/config/tc-nds32.c | 3 ++- gas/config/tc-ppc.c | 3 ++- gas/config/tc-sh.c | 3 +-- gas/config/tc-tic30.c | 15 +++++++++-- gas/config/tc-tic54x.c | 54 ++++++++++++++++++--------------------- gas/config/tc-xstormy16.c | 5 +++- gas/config/te-vms.c | 58 +++++++++++++++++++++++++++++++----------- gas/configure | 2 +- gas/dwarf2dbg.c | 3 ++- gas/macro.c | 6 +++-- gas/remap.c | 18 +++++-------- gas/stabs.c | 9 ++++--- gas/symbols.c | 28 +++++++++++++-------- gold/configure | 2 +- gprof/configure | 2 +- ld/ChangeLog | 6 +++++ ld/configure | 2 +- ld/emultempl/msp430.em | 14 ++++++++--- ld/pe-dll.c | 42 ++++++++++++++++++------------- ld/plugin.c | 12 +++++---- opcodes/cgen-opc.c | 3 ++- opcodes/configure | 2 +- 52 files changed, 410 insertions(+), 267 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 740fd44..fe63bd3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2016-03-21 Nick Clifton + + * warning.m4 (GCC_WARN_CFLAGS): Add -Wstack-usage=262144 + * configure: Regenerate. + * elf32-m68hc1x.c (elf32_m68hc11_relocate_section): Replace use of + alloca with call to xmalloc. + * elf32-nds32.c: Likewise. + * elf64-hppa.c: Likewise. + * elfxx-mips.c: Likewise. + * pef.c: Likewise. + * pei-x86_64.c: Likewise. + * som.c: Likewise. + * xsym.c: Likewise. + 2016-03-15 H.J. Lu PR ld/19827 diff --git a/bfd/configure b/bfd/configure index 1229323..de5f36d 100755 --- a/bfd/configure +++ b/bfd/configure @@ -12264,7 +12264,7 @@ fi NO_WERROR= if test "${ERROR_ON_WARNING}" = yes ; then - GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror" + GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror -Wstack-usage=262144" NO_WERROR="-Wno-error" fi diff --git a/bfd/elf32-m68hc1x.c b/bfd/elf32-m68hc1x.c index 76c9783..912efdf 100644 --- a/bfd/elf32-m68hc1x.c +++ b/bfd/elf32-m68hc1x.c @@ -28,7 +28,7 @@ #include "elf32-m68hc1x.h" #include "elf/m68hc11.h" #include "opcode/m68hc11.h" - +#include "libiberty.h" #define m68hc12_stub_hash_lookup(table, string, create, copy) \ ((struct elf32_m68hc11_stub_hash_entry *) \ @@ -592,13 +592,13 @@ m68hc11_elf_export_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg) result = (* htab->build_one_stub) (gen_entry, in_arg); /* Make a printable name that does not conflict with the real function. */ - name = alloca (strlen (stub_entry->root.string) + 16); - sprintf (name, "tramp.%s", stub_entry->root.string); + name = concat ("tramp.", stub_entry->root.string, NULL); /* Export the symbol for debugging/disassembling. */ m68hc11_elf_set_symbol (htab->stub_bfd, info, name, stub_entry->stub_offset, stub_entry->stub_sec); + free (name); return result; } @@ -956,6 +956,9 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, bfd_boolean is_section_symbol = FALSE; struct elf_link_hash_entry *h; bfd_vma val; + const char * msg; + char * buf; + bfd_boolean res; r_symndx = ELF32_R_SYM (rel->r_info); r_type = ELF32_R_TYPE (rel->r_info); @@ -1113,15 +1116,14 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, /* Get virtual address of instruction having the relocation. */ if (is_far) { - const char* msg; - char* buf; msg = _("Reference to the far symbol `%s' using a wrong " "relocation may result in incorrect execution"); - buf = alloca (strlen (msg) + strlen (name) + 10); + buf = xmalloc (strlen (msg) + strlen (name) + 10); sprintf (buf, msg, name); (* info->callbacks->warning) (info, buf, name, input_bfd, NULL, rel->r_offset); + free (buf); } /* Get virtual address of instruction having the relocation. */ @@ -1148,17 +1150,16 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, } else { - const char * msg; - char * buf; - msg = _("XGATE address (%lx) is not within shared RAM" "(0xE000-0xFFFF), therefore you must manually offset " "the address, and possibly manage the page, in your " "code."); - buf = alloca (strlen (msg) + 128); + buf = xmalloc (strlen (msg) + 128); sprintf (buf, msg, phys_addr); - if (!((*info->callbacks->warning) (info, buf, name, input_bfd, - input_section, insn_addr))) + res = (*info->callbacks->warning) (info, buf, name, input_bfd, + input_section, insn_addr); + free (buf); + if (! res) return FALSE; break; } @@ -1168,37 +1169,31 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, && m68hc11_addr_is_banked (pinfo, insn_addr) && phys_page != insn_page && !(e_flags & E_M68HC11_NO_BANK_WARNING)) { - const char * msg; - char * buf; - msg = _("banked address [%lx:%04lx] (%lx) is not in the same bank " "as current banked address [%lx:%04lx] (%lx)"); - - buf = alloca (strlen (msg) + 128); + buf = xmalloc (strlen (msg) + 128); sprintf (buf, msg, phys_page, phys_addr, (long) (relocation + rel->r_addend), insn_page, m68hc11_phys_addr (pinfo, insn_addr), (long) (insn_addr)); - if (!((*info->callbacks->warning) - (info, buf, name, input_bfd, input_section, - rel->r_offset))) + res = (*info->callbacks->warning) + (info, buf, name, input_bfd, input_section, rel->r_offset); + free (buf); + if (! res) return FALSE; break; } if (phys_page != 0 && insn_page == 0) { - const char * msg; - char * buf; - msg = _("reference to a banked address [%lx:%04lx] in the " "normal address space at %04lx"); - - buf = alloca (strlen (msg) + 128); + buf = xmalloc (strlen (msg) + 128); sprintf (buf, msg, phys_page, phys_addr, insn_addr); - if (!((*info->callbacks->warning) - (info, buf, name, input_bfd, input_section, - insn_addr))) + res = (*info->callbacks->warning) + (info, buf, name, input_bfd, input_section, insn_addr); + free (buf); + if (! res) return FALSE; relocation = phys_addr; @@ -1231,9 +1226,6 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, relocation += 0xC000; else { - const char * msg; - char * buf; - /* Get virtual address of instruction having the relocation. */ insn_addr = input_section->output_section->vma + input_section->output_offset + rel->r_offset; @@ -1241,10 +1233,12 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, msg = _("S12 address (%lx) is not within shared RAM" "(0x2000-0x4000), therefore you must manually " "offset the address in your code"); - buf = alloca (strlen (msg) + 128); + buf = xmalloc (strlen (msg) + 128); sprintf (buf, msg, phys_addr); - if (!((*info->callbacks->warning) (info, buf, name, input_bfd, - input_section, insn_addr))) + res = (*info->callbacks->warning) (info, buf, name, input_bfd, + input_section, insn_addr); + free (buf); + if (! res) return FALSE; break; } @@ -1265,8 +1259,6 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, if (r != bfd_reloc_ok) { - const char * msg = (const char *) 0; - switch (r) { case bfd_reloc_overflow: diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c index 5fffbf2..60cd51e 100644 --- a/bfd/elf32-nds32.c +++ b/bfd/elf32-nds32.c @@ -2300,7 +2300,7 @@ nds32_insertion_sort (void *base, size_t nmemb, size_t size, { char *ptr = (char *) base; int i, j; - char *tmp = alloca (size); + char *tmp = xmalloc (size); /* If i is less than j, i is inserted before j. @@ -2324,6 +2324,7 @@ nds32_insertion_sort (void *base, size_t nmemb, size_t size, memmove (ptr + (j + 1) * size, ptr + j * size, (i - j) * size); memcpy (ptr + j * size, tmp, size); } + free (tmp); } /* Sort relocation by r_offset. diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c index 3021ed6..a7bad70 100644 --- a/bfd/elf64-hppa.c +++ b/bfd/elf64-hppa.c @@ -26,7 +26,7 @@ #include "elf/hppa.h" #include "libhppa.h" #include "elf64-hppa.h" - +#include "libiberty.h" #define ARCH_SIZE 64 @@ -1094,20 +1094,18 @@ allocate_global_data_opd (struct elf_link_hash_entry *eh, void *data) char *new_name; struct elf_link_hash_entry *nh; - new_name = alloca (strlen (eh->root.root.string) + 2); - new_name[0] = '.'; - strcpy (new_name + 1, eh->root.root.string); + new_name = concat (".", eh->root.root.string, NULL); nh = elf_link_hash_lookup (elf_hash_table (x->info), new_name, TRUE, TRUE, TRUE); + free (new_name); nh->root.type = eh->root.type; nh->root.u.def.value = eh->root.u.def.value; nh->root.u.def.section = eh->root.u.def.section; if (! bfd_elf_link_record_dynamic_symbol (x->info, nh)) return FALSE; - } hh->opd_offset = x->ofs; x->ofs += OPD_ENTRY_SIZE; @@ -2205,9 +2203,7 @@ elf64_hppa_finalize_opd (struct elf_link_hash_entry *eh, void *data) char *new_name; struct elf_link_hash_entry *nh; - new_name = alloca (strlen (eh->root.root.string) + 2); - new_name[0] = '.'; - strcpy (new_name + 1, eh->root.root.string); + new_name = concat (".", eh->root.root.string, NULL); nh = elf_link_hash_lookup (elf_hash_table (info), new_name, TRUE, TRUE, FALSE); @@ -2216,6 +2212,7 @@ elf64_hppa_finalize_opd (struct elf_link_hash_entry *eh, void *data) symbol index. */ if (nh) dynindx = nh->dynindx; + free (new_name); } rel.r_addend = 0; diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index e4996fa..a46b2f5 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -1580,17 +1580,20 @@ mips_elf_create_stub_symbol (struct bfd_link_info *info, { struct bfd_link_hash_entry *bh; struct elf_link_hash_entry *elfh; - const char *name; + char *name; + bfd_boolean res; if (ELF_ST_IS_MICROMIPS (h->root.other)) value |= 1; /* Create a new symbol. */ - name = ACONCAT ((prefix, h->root.root.root.string, NULL)); + name = concat (prefix, h->root.root.root.string, NULL); bh = NULL; - if (!_bfd_generic_link_add_one_symbol (info, s->owner, name, - BSF_LOCAL, s, value, NULL, - TRUE, FALSE, &bh)) + res = _bfd_generic_link_add_one_symbol (info, s->owner, name, + BSF_LOCAL, s, value, NULL, + TRUE, FALSE, &bh); + free (name); + if (! res) return FALSE; /* Make it a local function. */ @@ -1612,9 +1615,10 @@ mips_elf_create_shadow_symbol (struct bfd_link_info *info, { struct bfd_link_hash_entry *bh; struct elf_link_hash_entry *elfh; - const char *name; + char *name; asection *s; bfd_vma value; + bfd_boolean res; /* Read the symbol's value. */ BFD_ASSERT (h->root.root.type == bfd_link_hash_defined @@ -1623,11 +1627,13 @@ mips_elf_create_shadow_symbol (struct bfd_link_info *info, value = h->root.root.u.def.value; /* Create a new symbol. */ - name = ACONCAT ((prefix, h->root.root.root.string, NULL)); + name = concat (prefix, h->root.root.root.string, NULL); bh = NULL; - if (!_bfd_generic_link_add_one_symbol (info, s->owner, name, - BSF_LOCAL, s, value, NULL, - TRUE, FALSE, &bh)) + res = _bfd_generic_link_add_one_symbol (info, s->owner, name, + BSF_LOCAL, s, value, NULL, + TRUE, FALSE, &bh); + free (name); + if (! res) return FALSE; /* Make it local and copy the other attributes from H. */ diff --git a/bfd/pef.c b/bfd/pef.c index b08202d..fb9a07a 100644 --- a/bfd/pef.c +++ b/bfd/pef.c @@ -217,7 +217,7 @@ bfd_pef_print_symbol (bfd *abfd, fprintf (file, " %-5s %s", symbol->section->name, symbol->name); if (CONST_STRNEQ (symbol->name, "__traceback_")) { - unsigned char *buf = alloca (symbol->udata.i); + unsigned char *buf = xmalloc (symbol->udata.i); size_t offset = symbol->value + 4; size_t len = symbol->udata.i; int ret; @@ -227,6 +227,7 @@ bfd_pef_print_symbol (bfd *abfd, len, 0, NULL, file); if (ret < 0) fprintf (file, " [ERROR]"); + free (buf); } } } diff --git a/bfd/pei-x86_64.c b/bfd/pei-x86_64.c index aa90b6f..c19b946 100644 --- a/bfd/pei-x86_64.c +++ b/bfd/pei-x86_64.c @@ -602,7 +602,7 @@ pex64_bfd_print_pdata_section (bfd *abfd, void *vfile, asection *pdata_section) if (strcmp (pdata_section->name, ".pdata") != 0) { size_t len = strlen (pdata_section->name); - char *xdata_name = alloca (len + 1); + char *xdata_name = xmalloc (len + 1); xdata_name = memcpy (xdata_name, pdata_section->name, len + 1); /* Transform .pdata prefix into .xdata prefix. */ @@ -610,6 +610,7 @@ pex64_bfd_print_pdata_section (bfd *abfd, void *vfile, asection *pdata_section) xdata_name [1] = 'x'; xdata_section = pex64_get_section_by_rva (abfd, xdata_base, xdata_name); + free (xdata_name); } /* Second, try the .xdata section itself. */ if (!xdata_section) diff --git a/bfd/som.c b/bfd/som.c index 1e2c0c6..859e886 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -24,7 +24,7 @@ #include "sysdep.h" #include "alloca-conf.h" #include "bfd.h" - +#include "libiberty.h" #include "libbfd.h" #include "som.h" #include "safe-ctype.h" @@ -3304,11 +3304,12 @@ som_write_space_strings (bfd *abfd, /* Chunk of memory that we can use as buffer space, then throw away. */ size_t tmp_space_size = SOM_TMP_BUFSIZE; - char *tmp_space = alloca (tmp_space_size); + char *tmp_space = xmalloc (tmp_space_size); char *p = tmp_space; unsigned int strings_size = 0; asection *section; bfd_size_type amt; + bfd_size_type res; /* Seek to the start of the space strings in preparation for writing them out. */ @@ -3355,7 +3356,7 @@ som_write_space_strings (bfd *abfd, tmp_space_size = length + 5; else tmp_space_size = 2 * tmp_space_size; - tmp_space = alloca (tmp_space_size); + tmp_space = xrealloc (tmp_space, tmp_space_size); } /* Reset to beginning of the (possibly new) buffer space. */ @@ -3391,7 +3392,9 @@ som_write_space_strings (bfd *abfd, /* Done with the space/subspace strings. Write out any information contained in a partial block. */ amt = p - tmp_space; - if (bfd_bwrite ((void *) &tmp_space[0], amt, abfd) != amt) + res = bfd_bwrite ((void *) &tmp_space[0], amt, abfd); + free (tmp_space); + if (res != amt) return FALSE; *string_sizep = strings_size; return TRUE; @@ -3408,15 +3411,14 @@ som_write_symbol_strings (bfd *abfd, struct som_compilation_unit *compilation_unit) { unsigned int i; - /* Chunk of memory that we can use as buffer space, then throw away. */ size_t tmp_space_size = SOM_TMP_BUFSIZE; - char *tmp_space = alloca (tmp_space_size); + char *tmp_space = xmalloc (tmp_space_size); char *p = tmp_space; - unsigned int strings_size = 0; bfd_size_type amt; + bfd_size_type res; /* This gets a bit gruesome because of the compilation unit. The strings within the compilation unit are part of the symbol @@ -3475,7 +3477,7 @@ som_write_symbol_strings (bfd *abfd, tmp_space_size = 5 + length; else tmp_space_size = 2 * tmp_space_size; - tmp_space = alloca (tmp_space_size); + tmp_space = xrealloc (tmp_space, tmp_space_size); } /* Reset to beginning of the (possibly new) buffer @@ -3530,7 +3532,7 @@ som_write_symbol_strings (bfd *abfd, tmp_space_size = 5 + length; else tmp_space_size = 2 * tmp_space_size; - tmp_space = alloca (tmp_space_size); + tmp_space = xrealloc (tmp_space, tmp_space_size); } /* Reset to beginning of the (possibly new) buffer space. */ @@ -3563,7 +3565,9 @@ som_write_symbol_strings (bfd *abfd, /* Scribble out any partial block. */ amt = p - tmp_space; - if (bfd_bwrite ((void *) &tmp_space[0], amt, abfd) != amt) + res = bfd_bwrite ((void *) &tmp_space[0], amt, abfd); + free (tmp_space); + if (res != amt) return FALSE; *string_sizep = strings_size; diff --git a/bfd/warning.m4 b/bfd/warning.m4 index abd1a17..0e838f6 100644 --- a/bfd/warning.m4 +++ b/bfd/warning.m4 @@ -49,7 +49,7 @@ fi NO_WERROR= if test "${ERROR_ON_WARNING}" = yes ; then - GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror" + GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror -Wstack-usage=262144" NO_WERROR="-Wno-error" fi diff --git a/bfd/xsym.c b/bfd/xsym.c index d10f175..c637f74 100644 --- a/bfd/xsym.c +++ b/bfd/xsym.c @@ -1804,7 +1804,7 @@ bfd_sym_print_type_information_table_entry (bfd *abfd, fprintf (f, "\n "); - buf = alloca (entry->physical_size); + buf = malloc (entry->physical_size); if (buf == NULL) { fprintf (f, "[ERROR]\n"); @@ -1813,11 +1813,13 @@ bfd_sym_print_type_information_table_entry (bfd *abfd, if (bfd_seek (abfd, entry->offset, SEEK_SET) < 0) { fprintf (f, "[ERROR]\n"); + free (buf); return; } if (bfd_bread (buf, entry->physical_size, abfd) != entry->physical_size) { fprintf (f, "[ERROR]\n"); + free (buf); return; } @@ -1837,6 +1839,7 @@ bfd_sym_print_type_information_table_entry (bfd *abfd, if (offset != entry->physical_size) fprintf (f, "\n [parser used %lu bytes instead of %lu]", offset, entry->physical_size); + free (buf); } void diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 918299a..50425c7 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,13 @@ +2016-03-21 Nick Clifton + + * dlltool.c: Replace use of alloca with call to xmalloc. + * dllwrap.c: Likewise. + * nlmconv.c: Likewise. + * objdump.c: Likewise. + * resrc.c: Likewise. + * winduni.c: Likewise. + * configure: Regenerate. + 2016-03-07 Nick Clifton PR binutils/19775 diff --git a/binutils/configure b/binutils/configure index dc735dc..a36b30b 100755 --- a/binutils/configure +++ b/binutils/configure @@ -11982,7 +11982,7 @@ fi NO_WERROR= if test "${ERROR_ON_WARNING}" = yes ; then - GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror" + GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror -Wstack-usage=262144" NO_WERROR="-Wno-error" fi diff --git a/binutils/dlltool.c b/binutils/dlltool.c index f97c6b4..e116e6b 100644 --- a/binutils/dlltool.c +++ b/binutils/dlltool.c @@ -1253,7 +1253,7 @@ def_import (const char *app_name, const char *module, const char *dllext, const char *entry, int ord_val, const char *its_name) { const char *application_name; - char *buf; + char *buf = NULL; if (entry != NULL) application_name = entry; @@ -1266,13 +1266,12 @@ def_import (const char *app_name, const char *module, const char *dllext, } if (dllext != NULL) - { - buf = (char *) alloca (strlen (module) + strlen (dllext) + 2); - sprintf (buf, "%s.%s", module, dllext); - module = buf; - } + module = buf = concat (module, ".", dllext, NULL); append_import (application_name, module, ord_val, its_name); + + if (buf) + free (buf); } void @@ -1334,7 +1333,7 @@ run (const char *what, char *args) if (*s == ' ') i++; i++; - argv = alloca (sizeof (char *) * (i + 3)); + argv = xmalloc (sizeof (char *) * (i + 3)); i = 0; argv[i++] = what; s = args; @@ -1353,6 +1352,7 @@ run (const char *what, char *args) pid = pexecute (argv[0], (char * const *) argv, program_name, temp_base, &errmsg_fmt, &errmsg_arg, PEXECUTE_ONE | PEXECUTE_SEARCH); + free(argv); if (pid == -1) { @@ -1986,12 +1986,13 @@ assemble_file (const char * source, const char * dest) { char * cmd; - cmd = (char *) alloca (strlen (ASM_SWITCHES) + strlen (as_flags) - + strlen (source) + strlen (dest) + 50); + cmd = xmalloc (strlen (ASM_SWITCHES) + strlen (as_flags) + + strlen (source) + strlen (dest) + 50); sprintf (cmd, "%s %s -o %s %s", ASM_SWITCHES, as_flags, dest, source); run (as_name, cmd); + free (cmd); } static const char * temp_file_to_remove[5]; @@ -3295,7 +3296,7 @@ gen_lib_file (int delay) { char *name; - name = (char *) alloca (strlen (TMP_STUB) + 10); + name = xmalloc (strlen (TMP_STUB) + 10); for (i = 0; (exp = d_exports_lexically[i]); i++) { /* Don't delete non-existent stubs for PRIVATE entries. */ @@ -3313,6 +3314,7 @@ gen_lib_file (int delay) non_fatal (_("cannot delete %s: %s"), name, strerror (errno)); } } + free (name); } inform (_("Created lib file")); diff --git a/binutils/dllwrap.c b/binutils/dllwrap.c index d14d154..a5f1b38 100644 --- a/binutils/dllwrap.c +++ b/binutils/dllwrap.c @@ -364,7 +364,7 @@ run (const char *what, char *args) if (*s == ' ') i++; i++; - argv = alloca (sizeof (char *) * (i + 3)); + argv = xmalloc (sizeof (char *) * (i + 3)); i = 0; argv[i++] = what; s = args; @@ -392,6 +392,7 @@ run (const char *what, char *args) pid = pexecute (argv[0], (char * const *) argv, prog_name, temp_base, &errmsg_fmt, &errmsg_arg, PEXECUTE_ONE | PEXECUTE_SEARCH); + free (argv); if (pid == -1) { diff --git a/binutils/nlmconv.c b/binutils/nlmconv.c index f45ff5e..eff15c5 100644 --- a/binutils/nlmconv.c +++ b/binutils/nlmconv.c @@ -2082,7 +2082,7 @@ link_inputs (struct string_list *inputs, char *ld, char * mfile) for (q = inputs; q != NULL; q = q->next) ++c; - argv = (char **) alloca ((c + 7) * sizeof (char *)); + argv = (char **) xmalloc ((c + 7) * sizeof (char *)); #ifndef __MSDOS__ if (ld == NULL) @@ -2140,6 +2140,8 @@ link_inputs (struct string_list *inputs, char *ld, char * mfile) pid = pexecute (ld, argv, program_name, (char *) NULL, &errfmt, &errarg, PEXECUTE_SEARCH | PEXECUTE_ONE); + free (argv); + if (pid == -1) { fprintf (stderr, _("%s: execution of %s failed: "), program_name, ld); diff --git a/binutils/objdump.c b/binutils/objdump.c index 3c94a76..6c8ab73 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -1348,6 +1348,7 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset) unsigned int linenumber; unsigned int discriminator; bfd_boolean reloc; + char *path = NULL; if (! with_line_numbers && ! with_source_code) return; @@ -1368,20 +1369,21 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset) { char *path_up; const char *fname = filename; - char *path = (char *) alloca (prefix_length + PATH_MAX + 1); + + path = xmalloc (prefix_length + PATH_MAX + 1); if (prefix_length) memcpy (path, prefix, prefix_length); path_up = path + prefix_length; /* Build relocated filename, stripping off leading directories - from the initial filename if requested. */ + from the initial filename if requested. */ if (prefix_strip > 0) { int level = 0; const char *s; - /* Skip selected directory levels. */ + /* Skip selected directory levels. */ for (s = fname + 1; *s != '\0' && level < prefix_strip; s++) if (IS_DIR_SEPARATOR(*s)) { @@ -1390,7 +1392,7 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset) } } - /* Update complete filename. */ + /* Update complete filename. */ strncpy (path_up, fname, PATH_MAX); path_up[PATH_MAX] = '\0'; @@ -1469,6 +1471,9 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset) if (discriminator != prev_discriminator) prev_discriminator = discriminator; + + if (path) + free (path); } /* Pseudo FILE object for strings. */ diff --git a/binutils/resrc.c b/binutils/resrc.c index 0cfd949..b6e320d 100644 --- a/binutils/resrc.c +++ b/binutils/resrc.c @@ -215,7 +215,7 @@ run_cmd (char *cmd, const char *redir) i++; i++; - argv = alloca (sizeof (char *) * (i + 3)); + argv = xmalloc (sizeof (char *) * (i + 3)); i = 0; s = cmd; @@ -266,6 +266,7 @@ run_cmd (char *cmd, const char *redir) pid = pexecute (argv[0], (char * const *) argv, program_name, temp_base, &errmsg_fmt, &errmsg_arg, PEXECUTE_ONE | PEXECUTE_SEARCH); + free (argv); /* Restore stdout to its previous setting. */ dup2 (stdout_save, STDOUT_FILENO); diff --git a/binutils/winduni.c b/binutils/winduni.c index d459b2e..4a6231a 100644 --- a/binutils/winduni.c +++ b/binutils/winduni.c @@ -213,7 +213,7 @@ unicode_from_ascii_len (rc_uint_type *length, unichar **unicode, const char *asc } /* Make sure we have zero terminated string. */ - p = tmp = (char *) alloca (a_length + 1); + p = tmp = (char *) xmalloc (a_length + 1); memcpy (tmp, ascii, a_length); tmp[a_length] = 0; @@ -279,6 +279,8 @@ unicode_from_ascii_len (rc_uint_type *length, unichar **unicode, const char *asc if (length) *length = idx; + + free (tmp); } /* Convert an unicode string to an ASCII string. We just copy it, diff --git a/gas/ChangeLog b/gas/ChangeLog index 9d601fd..53c3b3b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,29 @@ +2016-03-21 Nick Clifton + + * atof-generic.c: Replace use of alloca with call to xmalloc. + * cgen.c: Likewise. + * dwarf2dbg.c: Likewise. + * macro.c: Likewise. + * remap.c: Likewise. + * stabs.c: Likewise. + * symbols.c: Likewise. + * config/obj-elf.c: Likewise. + * config/tc-aarch64.c: Likewise. + * config/tc-arc.c: Likewise. + * config/tc-arm.c: Likewise. + * config/tc-avr.c: Likewise. + * config/tc-ia64.c: Likewise. + * config/tc-mips.c: Likewise. + * config/tc-msp430.c: Likewise. + * config/tc-nds32.c: Likewise. + * config/tc-ppc.c: Likewise. + * config/tc-sh.c: Likewise. + * config/tc-tic30.c: Likewise. + * config/tc-tic54x.c: Likewise. + * config/tc-xstormy16.c: Likewise. + * config/te-vms.c: Likewise. + * configure: Regenerate. + 2016-03-20 Trevor Saunders * tc-i386.c (f32_1): Change type to unsigned char[]. diff --git a/gas/atof-generic.c b/gas/atof-generic.c index 2041810..b1deec0 100644 --- a/gas/atof-generic.c +++ b/gas/atof-generic.c @@ -305,6 +305,8 @@ atof_generic (/* return pointer to just AFTER number we read. */ { int count; /* Number of useful digits left to scan. */ + LITTLENUM_TYPE *temporary_binary_low = NULL; + LITTLENUM_TYPE *power_binary_low = NULL; LITTLENUM_TYPE *digits_binary_low; unsigned int precision; unsigned int maximum_useful_digits; @@ -362,7 +364,7 @@ atof_generic (/* return pointer to just AFTER number we read. */ * sizeof (LITTLENUM_TYPE); digits_binary_low = (LITTLENUM_TYPE *) - alloca (size_of_digits_in_chars); + xmalloc (size_of_digits_in_chars); memset ((char *) digits_binary_low, '\0', size_of_digits_in_chars); @@ -455,13 +457,11 @@ atof_generic (/* return pointer to just AFTER number we read. */ * giving return_binary_mantissa and return_binary_exponent. */ - LITTLENUM_TYPE *power_binary_low; int decimal_exponent_is_negative; /* This refers to the "-56" in "12.34E-56". */ /* FALSE: decimal_exponent is positive (or 0) */ /* TRUE: decimal_exponent is negative */ FLONUM_TYPE temporary_flonum; - LITTLENUM_TYPE *temporary_binary_low; unsigned int size_of_power_in_littlenums; unsigned int size_of_power_in_chars; @@ -479,8 +479,9 @@ atof_generic (/* return pointer to just AFTER number we read. */ size_of_power_in_chars = size_of_power_in_littlenums * sizeof (LITTLENUM_TYPE) + 2; - power_binary_low = (LITTLENUM_TYPE *) alloca (size_of_power_in_chars); - temporary_binary_low = (LITTLENUM_TYPE *) alloca (size_of_power_in_chars); + power_binary_low = (LITTLENUM_TYPE *) xmalloc (size_of_power_in_chars); + temporary_binary_low = (LITTLENUM_TYPE *) xmalloc (size_of_power_in_chars); + memset ((char *) power_binary_low, '\0', size_of_power_in_chars); *power_binary_low = 1; power_of_10_flonum.exponent = 0; @@ -571,7 +572,6 @@ atof_generic (/* return pointer to just AFTER number we read. */ (void) putchar ('\n'); #endif } - } /* @@ -585,6 +585,11 @@ atof_generic (/* return pointer to just AFTER number we read. */ /* Assert sign of the number we made is '+'. */ address_of_generic_floating_point_number->sign = digits_sign_char; + if (temporary_binary_low) + free (temporary_binary_low); + if (power_binary_low) + free (power_binary_low); + free (digits_binary_low); } return return_value; } diff --git a/gas/cgen.c b/gas/cgen.c index 42d547b..bf8611f 100644 --- a/gas/cgen.c +++ b/gas/cgen.c @@ -891,7 +891,6 @@ gas_cgen_md_apply_fix (fixP, valP, seg) const CGEN_OPERAND *operand = cgen_operand_lookup_by_num (cd, opindex); const char *errmsg; bfd_reloc_code_real_type reloc_type; - CGEN_FIELDS *fields = alloca (CGEN_CPU_SIZEOF_FIELDS (cd)); const CGEN_INSN *insn = fixP->fx_cgen.insn; #ifdef OBJ_COMPLEX_RELC int start; @@ -927,6 +926,8 @@ gas_cgen_md_apply_fix (fixP, valP, seg) finish the job. Testing for pcrel is a temporary hack. */ || fixP->fx_pcrel) { + CGEN_FIELDS *fields = xmalloc (CGEN_CPU_SIZEOF_FIELDS (cd)); + CGEN_CPU_SET_FIELDS_BITSIZE (cd) (fields, CGEN_INSN_BITSIZE (insn)); CGEN_CPU_SET_VMA_OPERAND (cd) (cd, opindex, fields, (bfd_vma) value); @@ -950,6 +951,8 @@ gas_cgen_md_apply_fix (fixP, valP, seg) #endif if (errmsg) as_bad_where (fixP->fx_file, fixP->fx_line, "%s", errmsg); + + free (fields); } if (fixP->fx_done) diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index e8af394..bacaca3 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -1607,7 +1607,7 @@ obj_elf_vendor_attribute (int vendor) if (i == 0) goto bad; - name = (char *) alloca (i + 1); + name = xmalloc (i + 1); memcpy (name, s, i); name[i] = '\0'; @@ -1620,8 +1620,10 @@ obj_elf_vendor_attribute (int vendor) { as_bad (_("Attribute name not recognised: %s"), name); ignore_rest_of_line (); + free (name); return 0; } + free (name); } type = _bfd_elf_obj_attrs_arg_type (stdoutput, vendor, tag); @@ -2085,9 +2087,7 @@ adjust_stab_sections (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) if (!strcmp ("str", sec->name + strlen (sec->name) - 3)) return; - name = (char *) alloca (strlen (sec->name) + 4); - strcpy (name, sec->name); - strcat (name, "str"); + name = concat (sec->name, "str", NULL); strsec = bfd_get_section_by_name (abfd, name); if (strsec) strsz = bfd_section_size (abfd, strsec); @@ -2100,6 +2100,7 @@ adjust_stab_sections (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) bfd_h_put_16 (abfd, nsyms, p + 6); bfd_h_put_32 (abfd, strsz, p + 8); + free (name); } #ifdef NEED_ECOFF_DEBUG diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index b06c46a..64a732b 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -1241,7 +1241,7 @@ create_register_alias (char *newname, char *p) nlen = strlen (newname); #endif - nbuf = alloca (nlen + 1); + nbuf = xmalloc (nlen + 1); memcpy (nbuf, newname, nlen); nbuf[nlen] = '\0'; @@ -1265,7 +1265,10 @@ create_register_alias (char *newname, char *p) the artificial FOO alias because it has already been created by the first .req. */ if (insert_reg_alias (nbuf, old->number, old->type) == NULL) - return TRUE; + { + free (nbuf); + return TRUE; + } } for (p = nbuf; *p; p++) @@ -1275,6 +1278,7 @@ create_register_alias (char *newname, char *p) insert_reg_alias (nbuf, old->number, old->type); } + free (nbuf); return TRUE; } diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index 0e92c55..1431e6d 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -2894,7 +2894,7 @@ md_parse_option (int c, char *arg ATTRIBUTE_UNUSED) case OPTION_MCPU: { int i; - char *s = alloca (strlen (arg) + 1); + char *s = xmalloc (strlen (arg) + 1); { char *t = s; @@ -2907,7 +2907,7 @@ md_parse_option (int c, char *arg ATTRIBUTE_UNUSED) for (i = 0; cpu_types[i].name; ++i) { - if (!strcmp (cpu_types[i].name, s)) + if (strcmp (cpu_types[i].name, s) == 0) { arc_target = cpu_types[i].flags; arc_target_name = cpu_types[i].name; @@ -2921,9 +2921,8 @@ md_parse_option (int c, char *arg ATTRIBUTE_UNUSED) } if (!cpu_types[i].name) - { - as_fatal (_("unknown architecture: %s\n"), arg); - } + as_fatal (_("unknown architecture: %s\n"), arg); + free (s); break; } diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 5b3cf59..4cc808d 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -2255,7 +2255,7 @@ create_register_alias (char * newname, char *p) nlen = strlen (newname); #endif - nbuf = (char *) alloca (nlen + 1); + nbuf = xmalloc (nlen + 1); memcpy (nbuf, newname, nlen); nbuf[nlen] = '\0'; @@ -2279,7 +2279,10 @@ create_register_alias (char * newname, char *p) the artificial FOO alias because it has already been created by the first .req. */ if (insert_reg_alias (nbuf, old->number, old->type) == NULL) - return TRUE; + { + free (nbuf); + return TRUE; + } } for (p = nbuf; *p; p++) @@ -2289,6 +2292,7 @@ create_register_alias (char * newname, char *p) insert_reg_alias (nbuf, old->number, old->type); } + free (nbuf); return TRUE; } @@ -2416,7 +2420,7 @@ create_neon_reg_alias (char *newname, char *p) namelen = strlen (newname); #endif - namebuf = (char *) alloca (namelen + 1); + namebuf = xmalloc (namelen + 1); strncpy (namebuf, newname, namelen); namebuf[namelen] = '\0'; @@ -2439,6 +2443,7 @@ create_neon_reg_alias (char *newname, char *p) insert_neon_reg_alias (namebuf, basereg->number, basetype, typeinfo.defined != 0 ? &typeinfo : NULL); + free (namebuf); return TRUE; } @@ -2754,8 +2759,9 @@ find_real_start (symbolS * symbolP) if (S_IS_LOCAL (symbolP) || name[0] == '.') return symbolP; - real_start = ACONCAT ((STUB_NAME, name, NULL)); + real_start = concat (STUB_NAME, name, NULL); new_target = symbol_find (real_start); + free (real_start); if (new_target == NULL) { @@ -3529,7 +3535,8 @@ s_arm_elf_cons (int nbytes) XXX Surely there is a cleaner way to do this. */ char *p = input_line_pointer; int offset; - char *save_buf = (char *) alloca (input_line_pointer - base); + char *save_buf = xmalloc (input_line_pointer - base); + memcpy (save_buf, base, input_line_pointer - base); memmove (base + (input_line_pointer - before_reloc), base, before_reloc - base); @@ -3543,6 +3550,7 @@ s_arm_elf_cons (int nbytes) memset (p, 0, nbytes); fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, &exp, 0, (enum bfd_reloc_code_real) reloc); + free (save_buf); } } } @@ -14852,13 +14860,15 @@ do_neon_addsub_if_i (void) static void neon_exchange_operands (void) { - void *scratch = alloca (sizeof (inst.operands[0])); if (inst.operands[1].present) { + void *scratch = xmalloc (sizeof (inst.operands[0])); + /* Swap operands[1] and operands[2]. */ memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0])); inst.operands[1] = inst.operands[2]; memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0])); + free (scratch); } else { diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c index 69881b7..9bd164e 100644 --- a/gas/config/tc-avr.c +++ b/gas/config/tc-avr.c @@ -562,7 +562,7 @@ md_parse_option (int c, char *arg) case OPTION_MMCU: { int i; - char *s = alloca (strlen (arg) + 1); + char *s = xmalloc (strlen (arg) + 1); { char *t = s; @@ -577,6 +577,7 @@ md_parse_option (int c, char *arg) if (strcmp (mcu_types[i].name, s) == 0) break; + free (s); if (!mcu_types[i].name) { show_mcu_list (stderr); @@ -587,12 +588,12 @@ md_parse_option (int c, char *arg) type - this for allows passing -mmcu=... via gcc ASM_SPEC as well as .arch ... in the asm output at the same time. */ if (avr_mcu == &default_mcu || avr_mcu->mach == mcu_types[i].mach) - { - specified_mcu.name = mcu_types[i].name; - specified_mcu.isa |= mcu_types[i].isa; - specified_mcu.mach = mcu_types[i].mach; - avr_mcu = &specified_mcu; - } + { + specified_mcu.name = mcu_types[i].name; + specified_mcu.isa |= mcu_types[i].isa; + specified_mcu.mach = mcu_types[i].mach; + avr_mcu = &specified_mcu; + } else as_fatal (_("redefinition of mcu type `%s' to `%s'"), avr_mcu->name, mcu_types[i].name); diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index e43a7f9..c2f7372 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -3566,7 +3566,6 @@ start_unwind_section (const segT text_seg, int sec_index) char *sec_name; const char *prefix = special_section_name [sec_index]; const char *suffix; - size_t prefix_len, suffix_len, sec_name_len; sec_text_name = segment_name (text_seg); text_name = sec_text_name; @@ -3590,20 +3589,13 @@ start_unwind_section (const segT text_seg, int sec_index) suffix += sizeof (".gnu.linkonce.t.") - 1; } - prefix_len = strlen (prefix); - suffix_len = strlen (suffix); - sec_name_len = prefix_len + suffix_len; - sec_name = alloca (sec_name_len + 1); - memcpy (sec_name, prefix, prefix_len); - memcpy (sec_name + prefix_len, suffix, suffix_len); - sec_name [sec_name_len] = '\0'; + sec_name = concat (prefix, suffix, NULL); /* Handle COMDAT group. */ if ((text_seg->flags & SEC_LINK_ONCE) != 0 && (elf_section_flags (text_seg) & SHF_GROUP) != 0) { char *section; - size_t len, group_name_len; const char *group_name = elf_group_name (text_seg); if (group_name == NULL) @@ -3611,22 +3603,14 @@ start_unwind_section (const segT text_seg, int sec_index) as_bad (_("Group section `%s' has no group signature"), sec_text_name); ignore_rest_of_line (); + free (sec_name); return; } - /* We have to construct a fake section directive. */ - group_name_len = strlen (group_name); - len = (sec_name_len - + 16 /* ,"aG",@progbits, */ - + group_name_len /* ,group_name */ - + 7); /* ,comdat */ - - section = alloca (len + 1); - memcpy (section, sec_name, sec_name_len); - memcpy (section + sec_name_len, ",\"aG\",@progbits,", 16); - memcpy (section + sec_name_len + 16, group_name, group_name_len); - memcpy (section + len - 7, ",comdat", 7); - section [len] = '\0'; + + /* We have to construct a fake section directive. */ + section = concat (sec_name, ",\"aG\",@progbits,", group_name, ",comdat", NULL); set_section (section); + free (section); } else { @@ -3636,6 +3620,7 @@ start_unwind_section (const segT text_seg, int sec_index) } elf_linked_to_section (now_seg) = text_seg; + free (sec_name); } static void @@ -8078,8 +8063,7 @@ ia64_parse_name (char *name, expressionS *e, char *nextcharP) } } - end = alloca (strlen (name) + 1); - strcpy (end, name); + end = xstrdup (name); name = ia64_canonicalize_symbol_name (end); if ((dr = hash_find (md.dynreg_hash, name))) { @@ -8089,8 +8073,10 @@ ia64_parse_name (char *name, expressionS *e, char *nextcharP) bits. */ e->X_op = O_register; e->X_add_number = dr->base | (dr->num_regs << 16); + free (end); return 1; } + free (end); return 0; } diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 4657ce2..d089362 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -2420,9 +2420,8 @@ set_insn_error_ss (int argnum, const char *msg, const char *s1, const char *s2) static void report_insn_error (const char *str) { - const char *msg; + const char *msg = concat (insn_error.msg, " `%s'", NULL); - msg = ACONCAT ((insn_error.msg, " `%s'", NULL)); switch (insn_error.format) { case ERR_FMT_PLAIN: @@ -2437,6 +2436,8 @@ report_insn_error (const char *str) as_bad (msg, insn_error.u.ss[0], insn_error.u.ss[1], str); break; } + + free ((char *) msg); } /* Initialize vr4120_conflicts. There is a bit of duplication here: @@ -13530,14 +13531,14 @@ mips_lookup_insn (struct hash_control *hash, const char *start, struct mips_opcode *insn; /* Make a copy of the instruction so that we can fiddle with it. */ - name = alloca (length + 1); + name = xmalloc (length + 1); memcpy (name, start, length); name[length] = '\0'; /* Look up the instruction as-is. */ insn = (struct mips_opcode *) hash_find (hash, name); if (insn) - return insn; + goto end; dot = strchr (name, '.'); if (dot && dot[1]) @@ -13552,7 +13553,7 @@ mips_lookup_insn (struct hash_control *hash, const char *start, if (insn && (insn->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX) != 0) { *opcode_extra |= mask << mips_vu0_channel_mask.lsb; - return insn; + goto end; } } } @@ -13577,12 +13578,15 @@ mips_lookup_insn (struct hash_control *hash, const char *start, if (insn) { forced_insn_length = suffix; - return insn; + goto end; } } } - return NULL; + insn = NULL; + end: + free (name); + return insn; } /* Assemble an instruction into its binary format. If the instruction diff --git a/gas/config/tc-msp430.c b/gas/config/tc-msp430.c index eb7df08..5004362 100644 --- a/gas/config/tc-msp430.c +++ b/gas/config/tc-msp430.c @@ -698,7 +698,7 @@ static unsigned int silicon_errata_warn = 0; static void msp430_set_arch (int option) { - char *str = (char *) alloca (32); /* 32 for good measure. */ + char str[32]; /* 32 for good measure. */ input_line_pointer = extract_word (input_line_pointer, str, 32); diff --git a/gas/config/tc-nds32.c b/gas/config/tc-nds32.c index 774c470..66b8136 100644 --- a/gas/config/tc-nds32.c +++ b/gas/config/tc-nds32.c @@ -5141,6 +5141,7 @@ void md_assemble (char *str) { struct nds32_asm_insn insn; + expressionS expr; char *out; struct nds32_pseudo_opcode *popcode; const struct nds32_field *fld = NULL; @@ -5176,7 +5177,7 @@ md_assemble (char *str) } label_exist = 0; - insn.info = (expressionS *) alloca (sizeof (expressionS)); + insn.info = & expr; asm_desc.result = NASM_OK; nds32_assemble (&asm_desc, &insn, str); diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c index 02cbb95..64a35a0 100644 --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -3523,7 +3523,7 @@ ppc_macro (char *str, const struct powerpc_macro *macro) } /* Put the string together. */ - complete = s = (char *) alloca (len + 1); + complete = s = (char *) xmalloc (len + 1); format = macro->format; while (*format != '\0') { @@ -3541,6 +3541,7 @@ ppc_macro (char *str, const struct powerpc_macro *macro) /* Assemble the constructed instruction. */ md_assemble (complete); + free (complete); } #ifdef OBJ_ELF diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c index 8f04c59..1bb6d71 100644 --- a/gas/config/tc-sh.c +++ b/gas/config/tc-sh.c @@ -2292,7 +2292,6 @@ build_relax (sh_opcode_info *opcode, sh_operand_info *op) static char * insert_loop_bounds (char *output, sh_operand_info *operand) { - char *name; symbolS *end_sym; /* Since the low byte of the opcode will be overwritten by the reloc, we @@ -2305,6 +2304,7 @@ insert_loop_bounds (char *output, sh_operand_info *operand) if (sh_relax) { static int count = 0; + char name[11]; /* If the last loop insn is a two-byte-insn, it is in danger of being swapped with the insn after it. To prevent this, create a new @@ -2313,7 +2313,6 @@ insert_loop_bounds (char *output, sh_operand_info *operand) right in the middle, but four byte insns are not swapped anyways. */ /* A REPEAT takes 6 bytes. The SH has a 32 bit address space. Hence a 9 digit number should be enough to count all REPEATs. */ - name = alloca (11); sprintf (name, "_R%x", count++ & 0x3fffffff); end_sym = symbol_new (name, undefined_section, 0, &zero_address_frag); /* Make this a local symbol. */ diff --git a/gas/config/tc-tic30.c b/gas/config/tc-tic30.c index e069052..1853d8d 100644 --- a/gas/config/tc-tic30.c +++ b/gas/config/tc-tic30.c @@ -399,7 +399,6 @@ static operand * tic30_operand (char *token) { unsigned int count; - char ind_buffer[strlen (token)]; operand *current_op; debug ("In tic30_operand with %s\n", token); @@ -463,6 +462,9 @@ tic30_operand (char *token) int disp_number = 0; int buffer_posn = 1; ind_addr_type *ind_addr_op; + char * ind_buffer; + + ind_buffer = xmalloc (strlen (token)); debug ("Found indirect reference\n"); ind_buffer[0] = *token; @@ -480,11 +482,13 @@ tic30_operand (char *token) if (found_ar) { as_bad (_("More than one AR register found in indirect reference")); + free (ind_buffer); return NULL; } if (*(token + count + 1) < '0' || *(token + count + 1) > '7') { as_bad (_("Illegal AR register in indirect reference")); + free (ind_buffer); return NULL; } ar_number = *(token + count + 1) - '0'; @@ -505,6 +509,7 @@ tic30_operand (char *token) if (found_disp) { as_bad (_("More than one displacement found in indirect reference")); + free (ind_buffer); return NULL; } count++; @@ -513,6 +518,7 @@ tic30_operand (char *token) if (!is_digit_char (*(token + count))) { as_bad (_("Invalid displacement in indirect reference")); + free (ind_buffer); return NULL; } disp[disp_posn++] = *(token + (count++)); @@ -530,6 +536,7 @@ tic30_operand (char *token) if (!found_ar) { as_bad (_("AR register not found in indirect reference")); + free (ind_buffer); return NULL; } @@ -546,18 +553,21 @@ tic30_operand (char *token) { /* Maybe an implied displacement of 1 again. */ as_bad (_("required displacement wasn't given in indirect reference")); - return 0; + free (ind_buffer); + return NULL; } } else { as_bad (_("illegal indirect reference")); + free (ind_buffer); return NULL; } if (found_disp && (disp_number < 0 || disp_number > 255)) { as_bad (_("displacement must be an unsigned 8-bit number")); + free (ind_buffer); return NULL; } @@ -565,6 +575,7 @@ tic30_operand (char *token) current_op->indirect.disp = disp_number; current_op->indirect.ARnum = ar_number; current_op->op_type = Indirect; + free (ind_buffer); } else { diff --git a/gas/config/tc-tic54x.c b/gas/config/tc-tic54x.c index e071f95..1524cd3 100644 --- a/gas/config/tc-tic54x.c +++ b/gas/config/tc-tic54x.c @@ -322,7 +322,6 @@ tic54x_asg (int x ATTRIBUTE_UNUSED) int c; char *name; char *str; - char *tmp; int quoted = *input_line_pointer == '"'; ILLEGAL_WITHIN_STRUCT (); @@ -360,12 +359,8 @@ tic54x_asg (int x ATTRIBUTE_UNUSED) return; } - tmp = xmalloc (strlen (str) + 1); - strcpy (tmp, str); - str = tmp; - tmp = xmalloc (strlen (name) + 1); - strcpy (tmp, name); - name = tmp; + str = xstrdup (str); + name = xstrdup (name); subsym_create_or_replace (name, str); (void) restore_line_pointer (c); demand_empty_rest_of_line (); @@ -549,21 +544,16 @@ stag_add_field_symbols (struct stag *stag, symbolS *rootsym, const char *root_stag_name) { - char prefix[strlen (path) + 2]; + char * prefix; struct stag_field *field = stag->field; /* Construct a symbol for every field contained within this structure including fields within structure fields. */ - strcpy (prefix, path); - if (*path) - strcat (prefix, "."); + prefix = concat (path, *path ? "." : "", NULL); while (field != NULL) { - int len = strlen (prefix) + strlen (field->name) + 2; - char *name = xmalloc (len); - strcpy (name, prefix); - strcat (name, field->name); + char *name = concat (prefix, field->name, NULL); if (rootsym == NULL) { @@ -577,12 +567,10 @@ stag_add_field_symbols (struct stag *stag, } else { - char *replacement = xmalloc (strlen (name) - + strlen (stag->name) + 2); - strcpy (replacement, S_GET_NAME (rootsym)); - strcat (replacement, "+"); - strcat (replacement, root_stag_name); - strcat (replacement, name + strlen (S_GET_NAME (rootsym))); + char *replacement; + + replacement = concat (S_GET_NAME (rootsym), "+", root_stag_name, + name + strlen (S_GET_NAME (rootsym)), NULL); hash_insert (subsym_hash[0], name, replacement); } @@ -593,7 +581,9 @@ stag_add_field_symbols (struct stag *stag, field->offset, rootsym, root_stag_name); field = field->next; + free (name); } + free (prefix); } /* Keep track of stag fields so that when structures are nested we can add the @@ -695,11 +685,12 @@ tic54x_struct (int arg) } else { - char label[strlen (S_GET_NAME (line_label)) + 1]; - strcpy (label, S_GET_NAME (line_label)); - current_stag->sym = symbol_new (label, absolute_section, + char * label = xstrdup (S_GET_NAME (line_label)); + current_stag->sym = symbol_new (label, + absolute_section, (valueT) abs_section_offset, &zero_address_frag); + free (label); } current_stag->name = S_GET_NAME (current_stag->sym); SF_SET_LOCAL (current_stag->sym); @@ -803,9 +794,9 @@ tic54x_tag (int ignore ATTRIBUTE_UNUSED) } else { - char label[strlen (S_GET_NAME (line_label)) + 1]; + char * label; - strcpy (label, S_GET_NAME (line_label)); + label = xstrdup (S_GET_NAME (line_label)); if (current_stag != NULL) stag_add_field (current_stag, label, abs_section_offset - S_GET_VALUE (current_stag->sym), @@ -818,11 +809,13 @@ tic54x_tag (int ignore ATTRIBUTE_UNUSED) { as_bad (_(".tag target '%s' undefined"), label); ignore_rest_of_line (); + free (label); return; } stag_add_field_symbols (stag, S_GET_NAME (sym), S_GET_VALUE (stag->sym), sym, stag->name); } + free (label); } /* Bump by the struct size, but only if we're within a .struct section. */ @@ -933,12 +926,13 @@ tic54x_struct_field (int type) } else { - char label[strlen (S_GET_NAME (line_label) + 1)]; + char * label; - strcpy (label, S_GET_NAME (line_label)); + label = xstrdup (S_GET_NAME (line_label)); stag_add_field (current_stag, label, abs_section_offset - S_GET_VALUE (current_stag->sym), NULL); + free (label); } if (current_stag->is_union) @@ -4528,7 +4522,7 @@ subsym_substitute (char *line, int forced) if (value == NULL) { char digit[11]; - char *namecopy = strcpy (xmalloc (strlen (name) + 1), name); + char *namecopy = xstrdup (name); value = strcpy (xmalloc (strlen (name) + sizeof (digit) + 1), name); @@ -4653,7 +4647,7 @@ subsym_substitute (char *line, int forced) substitutions are performed, or a substitution that has been previously made is encountered again. - put the symbol into the recursion hash table so we only + Put the symbol into the recursion hash table so we only try to replace a symbol once. */ if (recurse) { diff --git a/gas/config/tc-xstormy16.c b/gas/config/tc-xstormy16.c index 2ea8490..6ee5be3 100644 --- a/gas/config/tc-xstormy16.c +++ b/gas/config/tc-xstormy16.c @@ -486,13 +486,14 @@ xstormy16_md_apply_fix (fixS * fixP, const CGEN_OPERAND *operand = cgen_operand_lookup_by_num (cd, opindex); const char *errmsg; bfd_reloc_code_real_type reloc_type; - CGEN_FIELDS *fields = alloca (CGEN_CPU_SIZEOF_FIELDS (cd)); const CGEN_INSN *insn = fixP->fx_cgen.insn; /* If the reloc has been fully resolved finish the operand here. */ /* FIXME: This duplicates the capabilities of code in BFD. */ if (fixP->fx_done) { + CGEN_FIELDS *fields = xmalloc (CGEN_CPU_SIZEOF_FIELDS (cd)); + CGEN_CPU_SET_FIELDS_BITSIZE (cd) (fields, CGEN_INSN_BITSIZE (insn)); CGEN_CPU_SET_VMA_OPERAND (cd) (cd, opindex, fields, (bfd_vma) value); @@ -516,6 +517,8 @@ xstormy16_md_apply_fix (fixS * fixP, #endif if (errmsg) as_bad_where (fixP->fx_file, fixP->fx_line, "%s", errmsg); + + free (fields); } if (fixP->fx_done) diff --git a/gas/config/te-vms.c b/gas/config/te-vms.c index 884e0a3..36752c3 100644 --- a/gas/config/te-vms.c +++ b/gas/config/te-vms.c @@ -115,7 +115,8 @@ vms_file_stats_name (const char *dirname, char *rfo, int *ver) { - char fullname[strlen (dirname) + strlen (filename) + 1]; + char * fullname; + #ifdef VMS struct FAB fab; struct NAM nam; @@ -168,9 +169,7 @@ vms_file_stats_name (const char *dirname, return 0; } - strcpy (fullname, dirname); - strcat (fullname, filename); - + fullname = concat (dirname, filename, NULL); tryfile = to_vms_file_spec (fullname); /* Allocate and initialize a FAB and NAM structures. */ @@ -188,14 +187,20 @@ vms_file_stats_name (const char *dirname, /* Validate filespec syntax and device existence. */ status = SYS$PARSE (&fab, 0, 0); if ((status & 1) != 1) - return 1; + { + free (fullname); + return 1; + } file.string[nam.nam$b_esl] = 0; /* Find matching filespec. */ status = SYS$SEARCH (&fab, 0, 0); if ((status & 1) != 1) - return 1; + { + free (fullname); + return 1; + } file.string[nam.nam$b_esl] = 0; result.string[result.length=nam.nam$b_rsl] = 0; @@ -206,7 +211,10 @@ vms_file_stats_name (const char *dirname, chan = 0; status = SYS$ASSIGN (&devicedsc, &chan, 0, 0, 0); if ((status & 1) != 1) - return 1; + { + free (fullname); + return 1; + } /* Initialize the FIB and fill in the directory id field. */ memset (&fib, 0, sizeof (fib)); @@ -224,22 +232,39 @@ vms_file_stats_name (const char *dirname, = SYS$QIOW (0, chan, IO$_ACCESS|IO$M_ACCESS, &iosb, 0, 0, &fibdsc, &filedsc, &result.length, &resultdsc, &atrlst, 0); if ((status & 1) != 1) - return 1; + { + free (fullname); + return 1; + } + if ((iosb.status & 1) != 1) - return 1; + { + free (fullname); + return 1; + } result.string[result.length] = 0; status = SYS$QIOW (0, chan, IO$_DEACCESS, &iosb, 0, 0, &fibdsc, 0, 0, 0, &atrlst, 0); if ((status & 1) != 1) - return 1; + { + free (fullname); + return 1; + } + if ((iosb.status & 1) != 1) - return 1; + { + free (fullname); + return 1; + } /* Deassign the channel and exit. */ status = SYS$DASSGN (chan); if ((status & 1) != 1) - return 1; + { + free (fullname); + return 1; + } if (cdt) *cdt = create; if (siz) *siz = (512 * 65536 * recattr.fat$w_efblkh) + @@ -253,11 +278,13 @@ vms_file_stats_name (const char *dirname, struct tm *ts; long long gmtoff, secs, nsecs; - strcpy (fullname, dirname); - strcat (fullname, filename); + fullname = concat (dirname, filename, NULL); if ((stat (fullname, &buff)) != 0) - return 1; + { + free (fullname); + return 1; + } if (cdt) { @@ -308,6 +335,7 @@ vms_file_stats_name (const char *dirname, *ver = 1; #endif /* VMS */ + free (fullname); return 0; } diff --git a/gas/configure b/gas/configure index bc5a1ba..6c43279 100755 --- a/gas/configure +++ b/gas/configure @@ -11755,7 +11755,7 @@ fi NO_WERROR= if test "${ERROR_ON_WARNING}" = yes ; then - GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror" + GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror -Wstack-usage=262144" NO_WERROR="-Wno-error" fi diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index c559cad..c719a5a 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -643,13 +643,14 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED) { size_t dir_len = strlen (dirs[files[filenum].dir]); size_t file_len = strlen (files[filenum].filename); - char *cp = (char *) alloca (dir_len + 1 + file_len + 1); + char *cp = (char *) xmalloc (dir_len + 1 + file_len + 1); memcpy (cp, dirs[files[filenum].dir], dir_len); INSERT_DIR_SEPARATOR (cp, dir_len); memcpy (cp + dir_len + 1, files[filenum].filename, file_len); cp[dir_len + file_len + 1] = '\0'; listing_source_file (cp); + free (cp); } else listing_source_file (files[filenum].filename); diff --git a/gas/macro.c b/gas/macro.c index b083382..cddf26a 100644 --- a/gas/macro.c +++ b/gas/macro.c @@ -1250,13 +1250,14 @@ check_macro (const char *line, sb *expand, if (is_name_ender (*s)) ++s; - copy = (char *) alloca (s - line + 1); + copy = (char *) xmalloc (s - line + 1); memcpy (copy, line, s - line); copy[s - line] = '\0'; for (cls = copy; *cls != '\0'; cls ++) *cls = TOLOWER (*cls); macro = (macro_entry *) hash_find (macro_hash, copy); + free (copy); if (macro == NULL) return 0; @@ -1288,7 +1289,7 @@ delete_macro (const char *name) macro_entry *macro; len = strlen (name); - copy = (char *) alloca (len + 1); + copy = (char *) xmalloc (len + 1); for (i = 0; i < len; ++i) copy[i] = TOLOWER (name[i]); copy[i] = '\0'; @@ -1303,6 +1304,7 @@ delete_macro (const char *name) } else as_warn (_("Attempt to purge non-existant macro `%s'"), copy); + free (copy); } /* Handle the MRI IRP and IRPC pseudo-ops. These are handled as a diff --git a/gas/remap.c b/gas/remap.c index 5f7b49e..87eda01 100644 --- a/gas/remap.c +++ b/gas/remap.c @@ -73,19 +73,13 @@ const char * remap_debug_filename (const char *filename) { debug_prefix_map *map; - char *s; - const char *name; - size_t name_len; for (map = debug_prefix_maps; map; map = map->next) if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0) - break; - if (!map) - return xstrdup (filename); - name = filename + map->old_len; - name_len = strlen (name) + 1; - s = (char *) alloca (name_len + map->new_len); - memcpy (s, map->new_prefix, map->new_len); - memcpy (s + map->new_len, name, name_len); - return xstrdup (s); + { + const char *name = filename + map->old_len; + return concat (map->new_prefix, name, NULL); + } + + return xstrdup (filename); } diff --git a/gas/stabs.c b/gas/stabs.c index b734f35..c489af0 100644 --- a/gas/stabs.c +++ b/gas/stabs.c @@ -500,9 +500,9 @@ stabs_generate_asm_file (void) char *dir2; dir = remap_debug_filename (getpwd ()); - dir2 = (char *) alloca (strlen (dir) + 2); - sprintf (dir2, "%s%s", dir, "/"); + dir2 = concat (dir, "/", NULL); generate_asm_file (N_SO, dir2); + free (dir2); xfree ((char *) dir); } generate_asm_file (N_SO, file); @@ -635,13 +635,13 @@ stabs_generate_asm_lineno (void) if (in_dot_func_p) { - buf = (char *) alloca (100 + strlen (current_function_label)); + buf = (char *) xmalloc (100 + strlen (current_function_label)); sprintf (buf, "%d,0,%d,%s-%s\n", N_SLINE, lineno, sym, current_function_label); } else { - buf = (char *) alloca (100); + buf = (char *) xmalloc (100); sprintf (buf, "%d,0,%d,%s\n", N_SLINE, lineno, sym); } input_line_pointer = buf; @@ -650,6 +650,7 @@ stabs_generate_asm_lineno (void) input_line_pointer = hold; outputting_stabs_line_debug = 0; + free (buf); } /* Emit a function stab. diff --git a/gas/symbols.c b/gas/symbols.c index e117049..62eaf18 100644 --- a/gas/symbols.c +++ b/gas/symbols.c @@ -743,34 +743,40 @@ symbol_find (const char *name) symbolS * symbol_find_noref (const char *name, int noref) { + symbolS * result; + char * copy = NULL; + #ifdef tc_canonicalize_symbol_name { - char *copy; - size_t len = strlen (name) + 1; - - copy = (char *) alloca (len); - memcpy (copy, name, len); + copy = xstrdup (name); name = tc_canonicalize_symbol_name (copy); } #endif if (! symbols_case_sensitive) { - char *copy; const char *orig; + char *copy2 = NULL; unsigned char c; orig = name; - name = copy = (char *) alloca (strlen (name) + 1); + if (copy != NULL) + copy2 = copy; + name = copy = xmalloc (strlen (name) + 1); while ((c = *orig++) != '\0') - { - *copy++ = TOUPPER (c); - } + *copy++ = TOUPPER (c); *copy = '\0'; + + if (copy2 != NULL) + free (copy2); + copy = (char *) name; } - return symbol_find_exact_noref (name, noref); + result = symbol_find_exact_noref (name, noref); + if (copy != NULL) + free (copy); + return result; } /* Once upon a time, symbols were kept in a singly linked list. At diff --git a/gold/configure b/gold/configure index 987a846..811a370 100755 --- a/gold/configure +++ b/gold/configure @@ -6728,7 +6728,7 @@ fi NO_WERROR= if test "${ERROR_ON_WARNING}" = yes ; then - GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror" + GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror -Wstack-usage=262144" NO_WERROR="-Wno-error" fi diff --git a/gprof/configure b/gprof/configure index 6740bf5..79813e0 100755 --- a/gprof/configure +++ b/gprof/configure @@ -12138,7 +12138,7 @@ fi NO_WERROR= if test "${ERROR_ON_WARNING}" = yes ; then - GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror" + GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror -Wstack-usage=262144" NO_WERROR="-Wno-error" fi diff --git a/ld/ChangeLog b/ld/ChangeLog index 0137ab3..eda1986 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2016-03-21 Nick Clifton + + * emultempl/msp430.em: Replace use of alloca with call to xmalloc. + * plugin.c: Likewise. + * pe-dll.c: Likewise. + 2016-03-18 Awson PR 19531 diff --git a/ld/configure b/ld/configure index cb1e573..4d8f237 100755 --- a/ld/configure +++ b/ld/configure @@ -15581,7 +15581,7 @@ fi NO_WERROR= if test "${ERROR_ON_WARNING}" = yes ; then - GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror" + GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror -Wstack-usage=262144" NO_WERROR="-Wno-error" fi diff --git a/ld/emultempl/msp430.em b/ld/emultempl/msp430.em index 8a4ad56..22e7c42 100644 --- a/ld/emultempl/msp430.em +++ b/ld/emultempl/msp430.em @@ -171,6 +171,7 @@ gld${EMULATION_NAME}_place_orphan (asection * s, char * lower_name; char * upper_name; char * name; + char * buf = NULL; lang_output_section_statement_type * lower; lang_output_section_statement_type * upper; lang_output_section_statement_type * os; @@ -197,15 +198,15 @@ gld${EMULATION_NAME}_place_orphan (asection * s, only use the part of the name before the second dot. */ if (strchr (secname + 1, '.') != NULL) { - name = ACONCAT ((secname, NULL)); + buf = name = xstrdup (secname); * strchr (name + 1, '.') = 0; } else name = (char *) secname; - lower_name = ACONCAT ((".lower", name, NULL)); - upper_name = ACONCAT ((".upper", name, NULL)); + lower_name = concat (".lower", name, NULL); + upper_name = concat (".upper", name, NULL); /* Find the corresponding lower and upper sections. */ lower = lang_output_section_find (lower_name); @@ -220,7 +221,7 @@ gld${EMULATION_NAME}_place_orphan (asection * s, if (upper == NULL) { einfo ("%P: error: no section named %s or %s in linker script\n", lower_name, upper_name); - return NULL; + goto end; } } else if (upper == NULL) @@ -255,6 +256,11 @@ gld${EMULATION_NAME}_place_orphan (asection * s, } lang_add_section (& os->children, s, NULL, os); + end: + free (upper_name); + free (lower_name); + if (buf) + free (buf); return os; } EOF diff --git a/ld/pe-dll.c b/ld/pe-dll.c index ccdbed0..a2792e8 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -894,17 +894,17 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info * for (i = 0; i < NE; i++) { + char *int_name = pe_def_file->exports[i].internal_name; char *name; - name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2); - if (pe_details->underscored - && (*pe_def_file->exports[i].internal_name != '@')) + name = xmalloc (strlen (int_name) + 2); + if (pe_details->underscored && int_name[0] != '@') { *name = '_'; - strcpy (name + 1, pe_def_file->exports[i].internal_name); + strcpy (name + 1, int_name); } else - strcpy (name, pe_def_file->exports[i].internal_name); + strcpy (name, int_name); blhe = bfd_link_hash_lookup (info->hash, name, @@ -940,7 +940,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info * but we must take care not to be fooled when the user wants to export a symbol that actually really has a dot in it, so we only check for them here, after real defined symbols have already been matched. */ - else if (strchr (pe_def_file->exports[i].internal_name, '.')) + else if (strchr (int_name, '.')) { count_exported++; if (!pe_def_file->exports[i].flag_noname) @@ -961,20 +961,20 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info * { /* xgettext:c-format */ einfo (_("%XCannot export %s: symbol not defined\n"), - pe_def_file->exports[i].internal_name); + int_name); } else if (blhe) { /* xgettext:c-format */ einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"), - pe_def_file->exports[i].internal_name, + int_name, blhe->type, bfd_link_hash_defined); } else { /* xgettext:c-format */ einfo (_("%XCannot export %s: symbol not found\n"), - pe_def_file->exports[i].internal_name); + int_name); } free (name); } @@ -2884,7 +2884,7 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name) struct bfd_link_hash_entry *h = NULL; struct key_value *kv; struct key_value key; - char *at, *lname = (char *) alloca (strlen (name) + 3); + char *at, *lname = xmalloc (strlen (name) + 3); strcpy (lname, name); @@ -2900,10 +2900,12 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name) { h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE); if (h->type == bfd_link_hash_undefined) - return h; + goto return_h; } + if (lname[0] == '?') - return NULL; + goto return_NULL; + if (at || lname[0] == '@') { if (lname[0] == '@') @@ -2919,7 +2921,7 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name) { h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE); if (h->type == bfd_link_hash_undefined) - return h; + goto return_h; } } if (at) @@ -2931,9 +2933,9 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name) { h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE); if (h->type == bfd_link_hash_undefined) - return h; + goto return_h; } - return NULL; + goto return_NULL; } strcat (lname, "@"); @@ -2945,7 +2947,7 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name) { h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE); if (h->type == bfd_link_hash_undefined) - return h; + goto return_h; } if (lname[0] == '_' && pe_details->underscored) @@ -2964,10 +2966,14 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name) { h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE); if (h->type == bfd_link_hash_undefined) - return h; + goto return_h; } - return NULL; + return_NULL: + h = NULL; + return_h: + free (lname); + return h; } static bfd_boolean diff --git a/ld/plugin.c b/ld/plugin.c index b3c8301..bf66f52 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -825,21 +825,23 @@ message (int level, const char *format, ...) break; case LDPL_WARNING: { - char *newfmt = ACONCAT (("%P: warning: ", format, "\n", - (const char *) NULL)); + char *newfmt = concat ("%P: warning: ", format, "\n", + (const char *) NULL); vfinfo (stdout, newfmt, args, TRUE); + free (newfmt); } break; case LDPL_FATAL: case LDPL_ERROR: default: { - char *newfmt = ACONCAT ((level == LDPL_FATAL ? "%P%F" : "%P%X", - ": error: ", format, "\n", - (const char *) NULL)); + char *newfmt = concat (level == LDPL_FATAL ? "%P%F" : "%P%X", + ": error: ", format, "\n", + (const char *) NULL); fflush (stdout); vfinfo (stderr, newfmt, args, TRUE); fflush (stderr); + free (newfmt); } break; } diff --git a/opcodes/cgen-opc.c b/opcodes/cgen-opc.c index d637c7c..543ce32 100644 --- a/opcodes/cgen-opc.c +++ b/opcodes/cgen-opc.c @@ -460,9 +460,10 @@ cgen_lookup_insn (CGEN_CPU_DESC cd, if (cd->int_insn_p) { info = NULL; - buf = (unsigned char *) alloca (cd->max_insn_bitsize / 8); + buf = (unsigned char *) xmalloc (cd->max_insn_bitsize / 8); cgen_put_insn_value (cd, buf, length, insn_int_value); base_insn = insn_int_value; + free (buf); } else { diff --git a/opcodes/configure b/opcodes/configure index 75c6573..a130b84 100755 --- a/opcodes/configure +++ b/opcodes/configure @@ -11545,7 +11545,7 @@ fi NO_WERROR= if test "${ERROR_ON_WARNING}" = yes ; then - GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror" + GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Werror -Wstack-usage=262144" NO_WERROR="-Wno-error" fi -- cgit v1.1