Replace uses of asprintf with xasprintf

xasprintf has a nicer interface and behaves like xmalloc as far as
memory is concerned, ie. no need to check a return status and the
program exits with an error on OOM.

binutils/
	* dwarf.c (load_debug_sup_file): Replace asprintf with xasprintf.
	* nm.c (get_elf_symbol_type, get_coff_symbol_type): Likewise.
	* objdump.c (dump_ctf_indent_lines): Likewise.
	* readelf.c (display_lto_symtab, dump_ctf_indent_lines): Likewise.
	* windres.c (main): Likewise.
	* configure.ac: Remove asprintf from AC_CHECK_DECLS.
	* config.in: Regenerate.
	* configure: Regenerate.
gas/
	* config/tc-kvx.c (kvx_emit_single_noop): Simplify.
	* config/tc-riscv.c (md_assemblef): Replace asprintf with xasprintf.
	* read.c (s_nop, do_s_func): Likewise.
	* stabs.c (stabs_generate_asm_func): Likewise.
	(stabs_generate_asm_endfunc): Likewise.
	* configure.ac: Remove asprintf from AC_CHECK_DECLS.
	* config.in: Regenerate.
	* configure: Regenerate.
ld/
	* ldlang.c (lang_leave_overlay_section): Replace xmalloc+sprintf
	with xasprintf.  Localise vars.
	* lexsup.c (parse_args): Replace asprintf with xasprintf.
	* pe-dll.c (make_head, make_tail, make_one): Likewise.
	(make_singleton_name_thunk, make_import_fixup_entry): Likewise.
	(make_runtime_pseudo_reloc): Likewise.
	(pe_create_runtime_relocator_reference): Likewise.
	* configure.ac: Remove asprintf from AC_CHECK_DECLS.
	* config.in: Regenerate.
	* configure: Regenerate.
This commit is contained in:
Alan Modra 2024-10-21 12:16:31 +10:30
parent 8b5a212495
commit 86b26b453f
21 changed files with 49 additions and 206 deletions

View File

@ -50,10 +50,6 @@
*/
#undef HAVE_DCGETTEXT
/* Define to 1 if you have the declaration of `asprintf', and to 0 if you
don't. */
#undef HAVE_DECL_ASPRINTF
/* Define to 1 if you have the declaration of `environ', and to 0 if you
don't. */
#undef HAVE_DECL_ENVIRON

10
binutils/configure vendored
View File

@ -15708,16 +15708,6 @@ $as_echo "#define HAVE_GOOD_UTIME_H 1" >>confdefs.h
fi
ac_fn_c_check_decl "$LINENO" "asprintf" "ac_cv_have_decl_asprintf" "$ac_includes_default"
if test "x$ac_cv_have_decl_asprintf" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_ASPRINTF $ac_have_decl
_ACEOF
ac_fn_c_check_decl "$LINENO" "environ" "ac_cv_have_decl_environ" "$ac_includes_default"
if test "x$ac_cv_have_decl_environ" = xyes; then :
ac_have_decl=1

View File

@ -279,7 +279,7 @@ if test $bu_cv_header_utime_h = yes; then
AC_DEFINE(HAVE_GOOD_UTIME_H, 1, [Does <utime.h> define struct utimbuf?])
fi
AC_CHECK_DECLS([asprintf, environ, getc_unlocked, stpcpy, strnlen])
AC_CHECK_DECLS([environ, getc_unlocked, stpcpy, strnlen])
# Link in zlib/zstd if we can. This allows us to read compressed debug
# sections. This is used only by readelf.c (objdump uses bfd for

View File

@ -12318,34 +12318,14 @@ load_debug_sup_file (const char * main_filename, void * file)
}
if (filename[0] != '/' && strchr (main_filename, '/'))
{
char * new_name;
int new_len;
new_len = asprintf (& new_name, "%.*s/%s",
filename = xasprintf ("%.*s/%s",
(int) (strrchr (main_filename, '/') - main_filename),
main_filename,
filename);
if (new_len < 3)
{
warn (_("unable to construct path for supplementary debug file\n"));
if (new_len > -1)
free (new_name);
return;
}
filename = new_name;
}
else
{
/* PR 27796: Make sure that we pass a filename that can be free'd to
add_separate_debug_file(). */
filename = strdup (filename);
if (filename == NULL)
{
warn (_("out of memory constructing filename for .debug_sup link\n"));
return;
}
}
/* PR 27796: Make sure that we pass a filename that can be free'd to
add_separate_debug_file(). */
filename = xstrdup (filename);
void * handle = open_debug_file (filename);
if (handle == NULL)

View File

@ -433,7 +433,6 @@ static const char *
get_elf_symbol_type (unsigned int type)
{
static char *bufp;
int n;
switch (type)
{
@ -448,13 +447,11 @@ get_elf_symbol_type (unsigned int type)
free (bufp);
if (type >= STT_LOPROC && type <= STT_HIPROC)
n = asprintf (&bufp, _("<processor specific>: %d"), type);
bufp = xasprintf (_("<processor specific>: %d"), type);
else if (type >= STT_LOOS && type <= STT_HIOS)
n = asprintf (&bufp, _("<OS specific>: %d"), type);
bufp = xasprintf (_("<OS specific>: %d"), type);
else
n = asprintf (&bufp, _("<unknown>: %d"), type);
if (n < 0)
fatal ("%s", xstrerror (errno));
bufp = xasprintf (_("<unknown>: %d"), type);
return bufp;
}
@ -462,7 +459,6 @@ static const char *
get_coff_symbol_type (const struct internal_syment *sym)
{
static char *bufp;
int n;
switch (sym->n_sclass)
{
@ -482,9 +478,7 @@ get_coff_symbol_type (const struct internal_syment *sym)
}
free (bufp);
n = asprintf (&bufp, _("<unknown>: %d/%d"), sym->n_sclass, sym->n_type);
if (n < 0)
fatal ("%s", xstrerror (errno));
bufp = xasprintf (_("<unknown>: %d/%d"), sym->n_sclass, sym->n_type);
return bufp;
}

View File

@ -4769,11 +4769,7 @@ dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
char *s, void *arg)
{
const char *blanks = arg;
char *new_s;
if (asprintf (&new_s, "%s%s", blanks, s) < 0)
return s;
return new_s;
return xasprintf ("%s%s", blanks, s);
}
/* Make a ctfsect suitable for ctf_bfdopen_ctfsect(). */

View File

@ -14421,17 +14421,14 @@ display_lto_symtab (Filedata * filedata,
return false;
/* Look for extended data for the symbol table. */
Elf_Internal_Shdr * ext = NULL;
void * ext_data_orig = NULL;
char * ext_data = NULL;
char * ext_data_end = NULL;
char * ext_name = NULL;
if (asprintf (& ext_name, ".gnu.lto_.ext_symtab.%s",
(section_name (filedata, section)
+ sizeof (".gnu.lto_.symtab.") - 1)) > 0
&& ext_name != NULL /* Paranoia. */
&& (ext = find_section (filedata, ext_name)) != NULL)
char *ext_name = xasprintf (".gnu.lto_.ext_symtab.%s",
(section_name (filedata, section)
+ sizeof (".gnu.lto_.symtab.")));
Elf_Internal_Shdr *ext = find_section (filedata, ext_name);
if (ext != NULL)
{
if (ext->sh_size < 3)
error (_("LTO Symbol extension table '%s' is empty!\n"),
@ -16871,11 +16868,7 @@ dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
char *s, void *arg)
{
const char *blanks = arg;
char *new_s;
if (asprintf (&new_s, "%s%s", blanks, s) < 0)
return s;
return new_s;
return xasprintf ("%s%s", blanks, s);
}
/* Dump CTF errors/warnings. */

View File

@ -885,10 +885,7 @@ main (int argc, char **argv)
case OPTION_PREPROCESSOR:
if (strchr (optarg, ' '))
{
if (asprintf (& preprocessor, "\"%s\"", optarg) == -1)
preprocessor = optarg;
}
preprocessor = xasprintf ("\"%s\"", optarg);
else
preprocessor = optarg;
break;

View File

@ -89,10 +89,6 @@
*/
#undef HAVE_DCGETTEXT
/* Define to 1 if you have the declaration of `asprintf', and to 0 if you
don't. */
#undef HAVE_DECL_ASPRINTF
/* Is the prototype for getopt in <unistd.h> in the expected format? */
#undef HAVE_DECL_GETOPT

View File

@ -2107,21 +2107,13 @@ kvx_check_label (symbolS *sym)
void
kvx_emit_single_noop (void)
{
char *nop;
char *end_of_bundle;
if (asprintf (&nop, "nop") < 0)
as_fatal ("%s", xstrerror (errno));
if (asprintf (&end_of_bundle, "be") < 0)
as_fatal ("%s", xstrerror (errno));
char nop[] = "nop";
char end_of_bundle[] = "be";
char *saved_ilp = input_line_pointer;
md_assemble (nop);
md_assemble (end_of_bundle);
input_line_pointer = saved_ilp;
free (nop);
free (end_of_bundle);
}
/* edit out some syntactic sugar that confuses GAS */

View File

@ -2107,17 +2107,12 @@ macro_build (expressionS *ep, const char *name, const char *fmt, ...)
static void
md_assemblef (const char *format, ...)
{
char *buf = NULL;
char *buf;
va_list ap;
int r;
va_start (ap, format);
r = vasprintf (&buf, format, ap);
if (r < 0)
as_fatal (_("internal: vasprintf failed"));
buf = xvasprintf (format, ap);
md_assemble (buf);
free(buf);

10
gas/configure vendored
View File

@ -15871,16 +15871,6 @@ $as_echo "#define NEED_DECLARATION_FFS 1" >>confdefs.h
fi
ac_fn_c_check_decl "$LINENO" "asprintf" "ac_cv_have_decl_asprintf" "$ac_includes_default"
if test "x$ac_cv_have_decl_asprintf" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_ASPRINTF $ac_have_decl
_ACEOF
ac_fn_c_check_decl "$LINENO" "mempcpy" "ac_cv_have_decl_mempcpy" "$ac_includes_default"
if test "x$ac_cv_have_decl_mempcpy" = xyes; then :
ac_have_decl=1

View File

@ -1002,7 +1002,7 @@ fi
GAS_CHECK_DECL_NEEDED(environ, f, char **f, $gas_test_headers)
GAS_CHECK_DECL_NEEDED(ffs, f, int (*f)(int), $gas_test_headers)
AC_CHECK_DECLS([asprintf, mempcpy, stpcpy])
AC_CHECK_DECLS([mempcpy, stpcpy])
BFD_BINARY_FOPEN

View File

@ -3604,8 +3604,7 @@ s_nop (int ignore ATTRIBUTE_UNUSED)
#endif
/* md_assemble might modify its argument, so
we must pass it a string that is writable. */
if (asprintf (&nop, "%s", md_single_noop_insn) < 0)
as_fatal ("%s", xstrerror (errno));
nop = xasprintf ("%s", md_single_noop_insn);
/* Some targets assume that they can update input_line_pointer
inside md_assemble, and, worse, that they can leave it
@ -6533,20 +6532,14 @@ do_s_func (int end_p, const char *default_prefix)
if (*input_line_pointer != ',')
{
if (default_prefix)
{
if (asprintf (&label, "%s%s", default_prefix, name) == -1)
as_fatal ("%s", xstrerror (errno));
}
label = xasprintf ("%s%s", default_prefix, name);
else
{
char leading_char = bfd_get_symbol_leading_char (stdoutput);
/* Missing entry point, use function's name with the leading
char prepended. */
if (leading_char)
{
if (asprintf (&label, "%c%s", leading_char, name) == -1)
as_fatal ("%s", xstrerror (errno));
}
label = xasprintf ("%c%s", leading_char, name);
else
label = xstrdup (name);
}

View File

@ -644,10 +644,8 @@ stabs_generate_asm_func (const char *funcname, const char *startlabname)
}
as_where (&lineno);
if (asprintf (&buf, "\"%s:F1\",%d,0,%d,%s",
funcname, N_FUN, lineno + 1, startlabname) == -1)
as_fatal ("%s", xstrerror (errno));
buf = xasprintf ("\"%s:F1\",%d,0,%d,%s",
funcname, N_FUN, lineno + 1, startlabname);
temp_ilp (buf);
s_stab ('s');
restore_ilp ();
@ -670,9 +668,7 @@ stabs_generate_asm_endfunc (const char *funcname ATTRIBUTE_UNUSED,
++endfunc_label_count;
colon (sym);
if (asprintf (&buf, "\"\",%d,0,0,%s-%s", N_FUN, sym, startlabname) == -1)
as_fatal ("%s", xstrerror (errno));
buf = xasprintf ("\"\",%d,0,0,%s-%s", N_FUN, sym, startlabname);
temp_ilp (buf);
s_stab ('s');
restore_ilp ();

View File

@ -95,10 +95,6 @@
*/
#undef HAVE_DCGETTEXT
/* Define to 1 if you have the declaration of `asprintf', and to 0 if you
don't. */
#undef HAVE_DECL_ASPRINTF
/* Define to 1 if you have the declaration of `environ', and to 0 if you
don't. */
#undef HAVE_DECL_ENVIRON

10
ld/configure vendored
View File

@ -18761,16 +18761,6 @@ $as_echo "#define USE_BINARY_FOPEN 1" >>confdefs.h
;;
esac
ac_fn_c_check_decl "$LINENO" "asprintf" "ac_cv_have_decl_asprintf" "$ac_includes_default"
if test "x$ac_cv_have_decl_asprintf" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_ASPRINTF $ac_have_decl
_ACEOF
ac_fn_c_check_decl "$LINENO" "environ" "ac_cv_have_decl_environ" "$ac_includes_default"
if test "x$ac_cv_have_decl_environ" = xyes; then :
ac_have_decl=1

View File

@ -408,7 +408,7 @@ AC_CHECK_FUNCS(close glob lseek mkstemp open realpath waitpid)
BFD_BINARY_FOPEN
AC_CHECK_DECLS([asprintf, environ, stpcpy])
AC_CHECK_DECLS([environ, stpcpy])
GCC_AC_FUNC_MMAP

View File

@ -9195,12 +9195,7 @@ void
lang_leave_overlay_section (fill_type *fill,
lang_output_section_phdr_list *phdrs)
{
const char *name;
char *clean, *s2;
const char *s1;
char *buf;
name = current_section->name;
const char *name = current_section->name;;
/* For now, assume that DEFAULT_MEMORY_REGION is the run-time memory
region and that no load-time region has been specified. It doesn't
@ -9210,21 +9205,19 @@ lang_leave_overlay_section (fill_type *fill,
/* Define the magic symbols. */
clean = (char *) xmalloc (strlen (name) + 1);
s2 = clean;
for (s1 = name; *s1 != '\0'; s1++)
char *clean = xmalloc (strlen (name) + 1);
char *s2 = clean;
for (const char *s1 = name; *s1 != '\0'; s1++)
if (ISALNUM (*s1) || *s1 == '_')
*s2++ = *s1;
*s2 = '\0';
buf = (char *) xmalloc (strlen (clean) + sizeof "__load_start_");
sprintf (buf, "__load_start_%s", clean);
char *buf = xasprintf ("__load_start_%s", clean);
lang_add_assignment (exp_provide (buf,
exp_nameop (LOADADDR, name),
false));
buf = (char *) xmalloc (strlen (clean) + sizeof "__load_stop_");
sprintf (buf, "__load_stop_%s", clean);
buf = xasprintf ("__load_stop_%s", clean);
lang_add_assignment (exp_provide (buf,
exp_binop ('+',
exp_nameop (LOADADDR, name),

View File

@ -1868,7 +1868,6 @@ parse_args (unsigned argc, char **argv)
{
char * new_name = NULL;
char * percent;
int res = 0;
if (config.map_filename[0] == 0)
{
@ -1885,9 +1884,9 @@ parse_args (unsigned argc, char **argv)
output filename. If the % character was the last character in
the original map filename then add a .map extension. */
percent[0] = 0;
res = asprintf (&new_name, "%s%s%s", config.map_filename,
output_filename,
percent[1] ? percent + 1 : ".map");
new_name = xasprintf ("%s%s%s", config.map_filename,
output_filename,
percent[1] ? percent + 1 : ".map");
/* FIXME: Should we ensure that any directory components in new_name exist ? */
}
@ -1905,10 +1904,9 @@ parse_args (unsigned argc, char **argv)
else if (S_ISDIR (s.st_mode))
{
char lastc = config.map_filename[strlen (config.map_filename) - 1];
res = asprintf (&new_name, "%s%s%s.map",
config.map_filename,
IS_DIR_SEPARATOR (lastc) ? "" : "/",
lbasename (output_filename));
new_name = xasprintf ("%s%s%s.map", config.map_filename,
IS_DIR_SEPARATOR (lastc) ? "" : "/",
lbasename (output_filename));
}
else if (! S_ISREG (s.st_mode))
{
@ -1918,14 +1916,7 @@ parse_args (unsigned argc, char **argv)
/* else FIXME: Check write permission ? */
}
if (res < 0)
{
/* If the asprintf failed then something is probably very
wrong. Better to halt now rather than continue on
into more problems. */
einfo (_("%P%F: cannot create name for linker map file: %E\n"));
}
else if (new_name != NULL)
if (new_name != NULL)
{
/* This is a trivial memory leak. */
config.map_filename = new_name;

View File

@ -2125,12 +2125,7 @@ make_head (bfd *parent)
char *oname;
bfd *abfd;
if (asprintf (&oname, "%s_d%06d.o", dll_symname, tmp_seq) < 4)
/* In theory we should return NULL here at let our caller decide what to
do. But currently the return value is not checked, just used, and
besides, this condition only happens when the system has run out of
memory. So just give up. */
exit (EXIT_FAILURE);
oname = xasprintf ("%s_d%06d.o", dll_symname, tmp_seq);
tmp_seq++;
abfd = bfd_create (oname, parent);
@ -2219,12 +2214,7 @@ make_tail (bfd *parent)
char *oname;
bfd *abfd;
if (asprintf (&oname, "%s_d%06d.o", dll_symname, tmp_seq) < 4)
/* In theory we should return NULL here at let our caller decide what to
do. But currently the return value is not checked, just used, and
besides, this condition only happens when the system has run out of
memory. So just give up. */
exit (EXIT_FAILURE);
oname = xasprintf ("%s_d%06d.o", dll_symname, tmp_seq);
tmp_seq++;
abfd = bfd_create (oname, parent);
@ -2412,12 +2402,7 @@ make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub)
}
}
if (asprintf (&oname, "%s_d%06d.o", dll_symname, tmp_seq) < 4)
/* In theory we should return NULL here at let our caller decide what to
do. But currently the return value is not checked, just used, and
besides, this condition only happens when the system has run out of
memory. So just give up. */
exit (EXIT_FAILURE);
oname = xasprintf ("%s_d%06d.o", dll_symname, tmp_seq);
tmp_seq++;
abfd = bfd_create (oname, parent);
@ -2600,12 +2585,7 @@ make_singleton_name_thunk (const char *import, bfd *parent)
char *oname;
bfd *abfd;
if (asprintf (&oname, "%s_nmth%06d.o", dll_symname, tmp_seq) < 4)
/* In theory we should return NULL here at let our caller decide what to
do. But currently the return value is not checked, just used, and
besides, this condition only happens when the system has run out of
memory. So just give up. */
exit (EXIT_FAILURE);
oname = xasprintf ("%s_nmth%06d.o", dll_symname, tmp_seq);
tmp_seq++;
abfd = bfd_create (oname, parent);
@ -2681,12 +2661,7 @@ make_import_fixup_entry (const char *name,
char *oname;
bfd *abfd;
if (asprintf (&oname, "%s_fu%06d.o", dll_symname, tmp_seq) < 4)
/* In theory we should return NULL here at let our caller decide what to
do. But currently the return value is not checked, just used, and
besides, this condition only happens when the system has run out of
memory. So just give up. */
exit (EXIT_FAILURE);
oname = xasprintf ("%s_fu%06d.o", dll_symname, tmp_seq);
tmp_seq++;
abfd = bfd_create (oname, parent);
@ -2740,12 +2715,7 @@ make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
bfd *abfd;
bfd_size_type size;
if (asprintf (&oname, "%s_rtr%06d.o", dll_symname, tmp_seq) < 4)
/* In theory we should return NULL here at let our caller decide what to
do. But currently the return value is not checked, just used, and
besides, this condition only happens when the system has run out of
memory. So just give up. */
exit (EXIT_FAILURE);
oname = xasprintf ("%s_rtr%06d.o", dll_symname, tmp_seq);
tmp_seq++;
abfd = bfd_create (oname, parent);
@ -2833,12 +2803,7 @@ pe_create_runtime_relocator_reference (bfd *parent)
char *oname;
bfd *abfd;
if (asprintf (&oname, "%s_ertr%06d.o", dll_symname, tmp_seq) < 4)
/* In theory we should return NULL here at let our caller decide what to
do. But currently the return value is not checked, just used, and
besides, this condition only happens when the system has run out of
memory. So just give up. */
exit (EXIT_FAILURE);
oname = xasprintf ("%s_ertr%06d.o", dll_symname, tmp_seq);
tmp_seq++;
abfd = bfd_create (oname, parent);