diff options
author | Alan Modra <amodra@gmail.com> | 2023-09-19 09:39:31 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-09-20 08:23:47 +0930 |
commit | a1d1634d0012ddeecc59bb0e6012d4455edae6e8 (patch) | |
tree | ba213a2d27da84a2ec41bc2a1e7fc6ac23730131 /gas | |
parent | a56e5dce69bfad45ee6977a916ccea283e087e8b (diff) | |
download | binutils-a1d1634d0012ddeecc59bb0e6012d4455edae6e8.zip binutils-a1d1634d0012ddeecc59bb0e6012d4455edae6e8.tar.gz binutils-a1d1634d0012ddeecc59bb0e6012d4455edae6e8.tar.bz2 |
elf-attrs.c memory allocation fail
Report errors rather than segfaulting.
bfd/
* elf-attrs.c (elf_new_obj_attr): Return NULL on bfd_alloc fail.
(bfd_elf_add_obj_attr_int): Handle NULL return from the above,
and propagate return to callers.
(elf_add_obj_attr_string, elf_add_obj_attr_int_string): Likewise.
(bfd_elf_add_obj_attr_string): Similarly.
(_bfd_elf_copy_obj_attributes): Report error on alloc fails.
(_bfd_elf_parse_attributes): Likewise.
* elf-bfd.h (bfd_elf_add_obj_attr_int): Update prototype.
(bfd_elf_add_obj_attr_string): Likewise.
(bfd_elf_add_obj_attr_int_string): Likewise.
gas/
* config/obj-elf.c (obj_elf_vendor_attribute): Report fatal
error on out of memory from bfd attribute functions.
* config/tc-arc.c (arc_set_attribute_int): Likewise.
(arc_set_attribute_string, arc_set_public_attributes): Likewise.
* config/tc-arm.c (aeabi_set_attribute_int): Likewise.
(aeabi_set_attribute_string): Likewise.
* config/tc-mips.c (mips_md_finish): Likewise.
* config/tc-msp430.c (msp430_md_finish): Likewise.
* config/tc-riscv.c (riscv_write_out_attrs): Likewise.
* config/tc-sparc.c (sparc_md_finish): Likewise.
* config/tc-tic6x.c (tic6x_set_attribute_int): Likewise.
* config/tc-csky.c (md_begin): Likewise.
(set_csky_attribute): Return ok status.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/obj-elf.c | 10 | ||||
-rw-r--r-- | gas/config/tc-arc.c | 16 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 8 | ||||
-rw-r--r-- | gas/config/tc-csky.c | 110 | ||||
-rw-r--r-- | gas/config/tc-mips.c | 6 | ||||
-rw-r--r-- | gas/config/tc-msp430.c | 37 | ||||
-rw-r--r-- | gas/config/tc-riscv.c | 15 | ||||
-rw-r--r-- | gas/config/tc-sparc.c | 12 | ||||
-rw-r--r-- | gas/config/tc-tic6x.c | 4 |
9 files changed, 137 insertions, 81 deletions
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 681e75f..eaf2d6a 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -2100,20 +2100,24 @@ obj_elf_vendor_attribute (int vendor) } record_attribute (vendor, tag); + bool ok = false; switch (type & 3) { case 3: - bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s); + ok = bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s); break; case 2: - bfd_elf_add_obj_attr_string (stdoutput, vendor, tag, s); + ok = bfd_elf_add_obj_attr_string (stdoutput, vendor, tag, s); break; case 1: - bfd_elf_add_obj_attr_int (stdoutput, vendor, tag, i); + ok = bfd_elf_add_obj_attr_int (stdoutput, vendor, tag, i); break; default: abort (); } + if (!ok) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); demand_empty_rest_of_line (); return tag; diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index d9b13a0..5f6f346 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -4941,7 +4941,9 @@ arc_set_attribute_int (int tag, int value) if (tag < 1 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES || !attributes_set_explicitly[tag]) - bfd_elf_add_proc_attr_int (stdoutput, tag, value); + if (!bfd_elf_add_proc_attr_int (stdoutput, tag, value)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } static void @@ -4950,7 +4952,9 @@ arc_set_attribute_string (int tag, const char *value) if (tag < 1 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES || !attributes_set_explicitly[tag]) - bfd_elf_add_proc_attr_string (stdoutput, tag, value); + if (!bfd_elf_add_proc_attr_string (stdoutput, tag, value)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } /* Allocate and concatenate two strings. s1 can be NULL but not @@ -5020,7 +5024,9 @@ arc_set_public_attributes (void) && (base != bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_PROC, Tag_ARC_CPU_base))) as_warn (_("Overwrite explicitly set Tag_ARC_CPU_base")); - bfd_elf_add_proc_attr_int (stdoutput, Tag_ARC_CPU_base, base); + if (!bfd_elf_add_proc_attr_int (stdoutput, Tag_ARC_CPU_base, base)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); /* Tag_ARC_ABI_osver. */ if (attributes_set_explicitly[Tag_ARC_ABI_osver]) @@ -5069,7 +5075,9 @@ arc_set_public_attributes (void) { as_warn (_("Overwrite explicitly set Tag_ARC_ABI_rf16 to full " "register file")); - bfd_elf_add_proc_attr_int (stdoutput, Tag_ARC_ABI_rf16, 0); + if (!bfd_elf_add_proc_attr_int (stdoutput, Tag_ARC_ABI_rf16, 0)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } } diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index f912fb2..56345ea 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -32984,7 +32984,9 @@ aeabi_set_attribute_int (int tag, int value) if (tag < 1 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES || !attributes_set_explicitly[tag]) - bfd_elf_add_proc_attr_int (stdoutput, tag, value); + if (!bfd_elf_add_proc_attr_int (stdoutput, tag, value)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } static void @@ -32993,7 +32995,9 @@ aeabi_set_attribute_string (int tag, const char *value) if (tag < 1 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES || !attributes_set_explicitly[tag]) - bfd_elf_add_proc_attr_string (stdoutput, tag, value); + if (!bfd_elf_add_proc_attr_string (stdoutput, tag, value)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } /* Return whether features in the *NEEDED feature set are available via diff --git a/gas/config/tc-csky.c b/gas/config/tc-csky.c index 41205e7..8f2d29f 100644 --- a/gas/config/tc-csky.c +++ b/gas/config/tc-csky.c @@ -1541,79 +1541,95 @@ md_show_usage (FILE *fp) -mvdsp enable vector DSP instructions\n")); } -static void set_csky_attribute (void) +static bool +set_csky_attribute (void) { if (mach_flag & CSKY_ARCH_DSP) { if (dsp_flag & CSKY_DSP_FLAG_V2) { /* Set DSPV2. */ - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_DSP_VERSION, - VAL_CSKY_DSP_VERSION_2); + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_DSP_VERSION, + VAL_CSKY_DSP_VERSION_2)) + return false; } else if (isa_flag & CSKY_ISA_DSP) { /* Set DSP extension. */ - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_DSP_VERSION, - VAL_CSKY_DSP_VERSION_EXTENSION); + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_DSP_VERSION, + VAL_CSKY_DSP_VERSION_EXTENSION)) + return false; } /* Set VDSP attribute. */ if (isa_flag & CSKY_ISA_VDSP) - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_VDSP_VERSION, - VAL_CSKY_VDSP_VERSION_1); - + { + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_VDSP_VERSION, + VAL_CSKY_VDSP_VERSION_1)) + return false; + } else if (isa_flag & CSKY_ISA_VDSP_2) - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_VDSP_VERSION, - VAL_CSKY_VDSP_VERSION_2); - + { + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_VDSP_VERSION, + VAL_CSKY_VDSP_VERSION_2)) + return false; + } } if (mach_flag & CSKY_ARCH_FLOAT) { unsigned int val = VAL_CSKY_FPU_HARDFP_SINGLE; - if (IS_CSKY_ARCH_V1 (mach_flag)) { - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_FPU_VERSION, - VAL_CSKY_FPU_VERSION_1); - } + if (IS_CSKY_ARCH_V1 (mach_flag)) + { + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_FPU_VERSION, + VAL_CSKY_FPU_VERSION_1)) + return false; + } else { if (isa_flag & CSKY_ISA_FLOAT_3E4) { - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_FPU_VERSION, - VAL_CSKY_FPU_VERSION_2); + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_FPU_VERSION, + VAL_CSKY_FPU_VERSION_2)) + return false; val |= VAL_CSKY_FPU_HARDFP_DOUBLE; } else { - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_FPU_VERSION, - VAL_CSKY_FPU_VERSION_2); + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_FPU_VERSION, + VAL_CSKY_FPU_VERSION_2)) + return false; } - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_FPU_HARDFP, - val); - bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_FPU_NUMBER_MODULE, - "IEEE 754"); - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_FPU_ABI, - float_abi); + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_FPU_HARDFP, val)) + return false; + if (!bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_FPU_NUMBER_MODULE, + "IEEE 754")) + return false; + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_FPU_ABI, + float_abi)) + return false; } } + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_ISA_FLAGS, isa_flag)) + return false; - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_ISA_FLAGS, isa_flag); + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_ISA_EXT_FLAGS, (isa_flag >> 32))) + return false; - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_ISA_EXT_FLAGS, (isa_flag >> 32)); + return true; } /* Target-specific initialization and option handling. */ @@ -1676,8 +1692,10 @@ md_begin (void) for (p_arch = csky_archs; p_arch->arch_flag != 0; p_arch++) if ((mach_flag & CSKY_ARCH_MASK) == (p_arch->arch_flag & CSKY_ARCH_MASK)) { - bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_ARCH_NAME, p_arch->name); + if (!bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_ARCH_NAME, p_arch->name)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); bfd_mach_flag = p_arch->bfd_mach_flag; break; } @@ -1686,8 +1704,10 @@ md_begin (void) for (p_cpu = csky_cpus; p_cpu->arch_flag != 0; p_cpu++) if ((mach_flag & CPU_ARCH_MASK) == p_cpu->arch_flag) { - bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC, - Tag_CSKY_CPU_NAME, p_cpu->name); + if (!bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC, + Tag_CSKY_CPU_NAME, p_cpu->name)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); isa_flag |= p_cpu->isa_flag; break; } @@ -1856,7 +1876,9 @@ md_begin (void) /* Set bfd_mach to bfd backend data. */ bfd_set_arch_mach (stdoutput, bfd_arch_csky, bfd_mach_flag); - set_csky_attribute (); + if (!set_csky_attribute ()) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } /* The C-SKY assembler emits mapping symbols $t and $d to mark the diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index d6aae66..24cef90 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -20626,8 +20626,10 @@ mips_md_finish (void) } } - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, - Tag_GNU_MIPS_ABI_FP, fpabi); + if (!bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, + Tag_GNU_MIPS_ABI_FP, fpabi)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } } diff --git a/gas/config/tc-msp430.c b/gas/config/tc-msp430.c index c160451..e3c66a3 100644 --- a/gas/config/tc-msp430.c +++ b/gas/config/tc-msp430.c @@ -5130,24 +5130,27 @@ msp430_md_finish (void) /* We have already emitted an error if any of the following attributes disagree with the attributes in the input assembly file. See msp430_object_attribute. */ - bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_ISA, - target_is_430x () ? OFBA_MSPABI_Val_ISA_MSP430X - : OFBA_MSPABI_Val_ISA_MSP430); - - bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Code_Model, - large_model ? OFBA_MSPABI_Val_Code_Model_LARGE - : OFBA_MSPABI_Val_Code_Model_SMALL); - - bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Data_Model, - large_model ? OFBA_MSPABI_Val_Code_Model_LARGE - : OFBA_MSPABI_Val_Code_Model_SMALL); - + if (!bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_ISA, + target_is_430x () + ? OFBA_MSPABI_Val_ISA_MSP430X + : OFBA_MSPABI_Val_ISA_MSP430) + || !bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Code_Model, + large_model + ? OFBA_MSPABI_Val_Code_Model_LARGE + : OFBA_MSPABI_Val_Code_Model_SMALL) + || !bfd_elf_add_proc_attr_int (stdoutput, OFBA_MSPABI_Tag_Data_Model, + large_model + ? OFBA_MSPABI_Val_Code_Model_LARGE + : OFBA_MSPABI_Val_Code_Model_SMALL) /* The data region GNU attribute is ignored for the small memory model. */ - if (large_model) - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, - Tag_GNU_MSP430_Data_Region, lower_data_region_only - ? Val_GNU_MSP430_Data_Region_Lower - : Val_GNU_MSP430_Data_Region_Any); + || (large_model + && !bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, + Tag_GNU_MSP430_Data_Region, + lower_data_region_only + ? Val_GNU_MSP430_Data_Region_Lower + : Val_GNU_MSP430_Data_Region_Any))) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } /* Returns FALSE if there is a msp430 specific reason why the diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 3b520ad..0b8ecf9 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -4902,7 +4902,9 @@ riscv_write_out_attrs (void) /* Re-write architecture elf attribute. */ arch_str = riscv_rps_as.subset_list->arch_str; - bfd_elf_add_proc_attr_string (stdoutput, Tag_RISCV_arch, arch_str); + if (!bfd_elf_add_proc_attr_string (stdoutput, Tag_RISCV_arch, arch_str)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); /* For the file without any instruction, we don't set the default_priv_spec according to the privileged elf attributes since the md_assemble isn't @@ -4937,9 +4939,14 @@ riscv_write_out_attrs (void) versions[i] = number; /* Re-write privileged elf attributes. */ - bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec, versions[0]); - bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_minor, versions[1]); - bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_revision, versions[2]); + if (!bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec, + versions[0]) + || !bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_minor, + versions[1]) + || !bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_revision, + versions[2])) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } /* Add the default contents for the .riscv.attributes section. */ diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c index c273bd7..587c159 100644 --- a/gas/config/tc-sparc.c +++ b/gas/config/tc-sparc.c @@ -1125,10 +1125,14 @@ sparc_md_finish (void) hwcaps = hwcap_seen & U0xffffffff; hwcaps2 = hwcap_seen >> 32; - if (hwcaps) - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, Tag_GNU_Sparc_HWCAPS, hwcaps); - if (hwcaps2) - bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, Tag_GNU_Sparc_HWCAPS2, hwcaps2); + if ((hwcaps + && !bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, + Tag_GNU_Sparc_HWCAPS, hwcaps)) + || (hwcaps2 + && !bfd_elf_add_obj_attr_int (stdoutput, OBJ_ATTR_GNU, + Tag_GNU_Sparc_HWCAPS2, hwcaps2))) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); #endif } diff --git a/gas/config/tc-tic6x.c b/gas/config/tc-tic6x.c index 7cf4d94..6ed61ea 100644 --- a/gas/config/tc-tic6x.c +++ b/gas/config/tc-tic6x.c @@ -4381,7 +4381,9 @@ tic6x_set_attribute_int (int tag, int value) || tag >= NUM_KNOWN_OBJ_ATTRIBUTES) abort (); if (!tic6x_attributes_set_explicitly[tag]) - bfd_elf_add_proc_attr_int (stdoutput, tag, value); + if (!bfd_elf_add_proc_attr_int (stdoutput, tag, value)) + as_fatal (_("error adding attribute: %s"), + bfd_errmsg (bfd_get_error ())); } /* Set object attributes deduced from the input file and command line |