From: Michael Pratt Date: Wed, 16 Oct 2024 19:53:52 +0000 (+0000) Subject: Remove usage of "unlocked" variant of stdio print functions X-Git-Tag: elfutils-0.192~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=12d58cf3e30dee91ed7aadb6475a15c6e74cc88b;p=thirdparty%2Felfutils.git Remove usage of "unlocked" variant of stdio print functions These "unlocked" Linux Standard Base variants of standard functions are not available on some systems that are still capable of building Linux and ELFs. The difference is negligible for simple printing to stdout. POSIX also states for the similar putc_unlocked(): These functions can safely be used in a multi-threaded program if and only if they are called while the invoking thread owns the (FILE *) object, as is the case after a successful call to the flockfile() or ftrylockfile() functions. ... These unlocked versions can be safely used only within explicitly locked program regions, using exported locking primitives. and these precautions were never done. Use the standard forms of these print functions. There is inconsistent use of fputc_unlocked() with putc_unlocked(), so consistently use the safer fputc() instead. Signed-off-by: Michael Pratt --- diff --git a/libasm/asm_align.c b/libasm/asm_align.c index 3a9767566..19ec9a131 100644 --- a/libasm/asm_align.c +++ b/libasm/asm_align.c @@ -60,13 +60,13 @@ asm_align (AsmScn_t *asmscn, GElf_Word value) fprintf (asmscn->ctx->out.file, "%02hhx\n", asmscn->pattern->bytes[0]); else { - fputc_unlocked ('"', asmscn->ctx->out.file); + fputc ('"', asmscn->ctx->out.file); for (size_t cnt = 0; cnt < asmscn->pattern->len; ++cnt) fprintf (asmscn->ctx->out.file, "\\x%02hhx", asmscn->pattern->bytes[cnt]); - fputs_unlocked ("\"\n", asmscn->ctx->out.file); + fputs ("\"\n", asmscn->ctx->out.file); } return 0; } diff --git a/libcpu/i386_parse.y b/libcpu/i386_parse.y index 459684c6a..5c91e520c 100644 --- a/libcpu/i386_parse.y +++ b/libcpu/i386_parse.y @@ -1158,7 +1158,7 @@ instrtable_out (void) EMIT_SUFFIX (w1); EMIT_SUFFIX (W1); - fputc_unlocked ('\n', outfile); + fputc ('\n', outfile); for (int i = 0; i < 3; ++i) { @@ -1333,7 +1333,7 @@ instrtable_out (void) b = b->next; } - fputc_unlocked ('\n', outfile); + fputc ('\n', outfile); } fputs ("};\n", outfile); } diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c index ad3f49de3..cf6f680eb 100644 --- a/libebl/eblobjnote.c +++ b/libebl/eblobjnote.c @@ -648,10 +648,10 @@ ebl_object_note (Ebl *ebl, uint32_t namesz, const char *name, uint32_t type, for (size_t cnt = 1; cnt < descsz / 4; ++cnt) { if (cnt > 1) - putchar_unlocked ('.'); + putchar ('.'); printf ("%" PRIu32, buf[cnt]); } - putchar_unlocked ('\n'); + putchar ('\n'); } if (descsz / 4 > FIXED_TAG_BYTES) free (buf); diff --git a/src/nm.c b/src/nm.c index 3675f59b5..40b192f67 100644 --- a/src/nm.c +++ b/src/nm.c @@ -439,7 +439,7 @@ handle_ar (int fd, Elf *elf, const char *prefix, const char *fname, Elf_Arhdr *arhdr = NULL; size_t arhdr_off = 0; /* Note: 0 is no valid offset. */ - fputs_unlocked (_("\nArchive index:\n"), stdout); + fputs (_("\nArchive index:\n"), stdout); while (arsym->as_off != 0) { @@ -825,8 +825,8 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx, const char *fullname, /* If we have to precede the line with the file name. */ if (print_file_name) { - fputs_unlocked (fullname, stdout); - putchar_unlocked (':'); + fputs (fullname, stdout); + putchar (':'); } /* Convert the address. */ @@ -972,8 +972,8 @@ show_symbols_bsd (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx, /* If we have to precede the line with the file name. */ if (print_file_name) { - fputs_unlocked (fullname, stdout); - putchar_unlocked (':'); + fputs (fullname, stdout); + putchar (':'); } bool is_tls = GELF_ST_TYPE (syms[cnt].sym.st_info) == STT_TLS; @@ -1046,8 +1046,8 @@ show_symbols_bsd (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx, } if (color_mode) - fputs_unlocked (color_off, stdout); - putchar_unlocked ('\n'); + fputs (color_off, stdout); + putchar ('\n'); } #ifdef USE_DEMANGLE @@ -1104,9 +1104,9 @@ show_symbols_posix (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx, /* If we have to precede the line with the file name. */ if (print_file_name) { - fputs_unlocked (fullname, stdout); - putchar_unlocked (':'); - putchar_unlocked (' '); + fputs (fullname, stdout); + putchar (':'); + putchar (' '); } printf ("%s %c%s", symstr, diff --git a/src/objdump.c b/src/objdump.c index d43c1dd65..1b38da232 100644 --- a/src/objdump.c +++ b/src/objdump.c @@ -580,12 +580,12 @@ show_full_content (Ebl *ebl, const char *fname, uint32_t shstrndx) printf ("%02hhx%02hhx%02hhx%02hhx ", cp[inner], cp[inner + 1], cp[inner + 2], cp[inner + 3]); - fputc_unlocked (' ', stdout); + fputc (' ', stdout); for (size_t inner = 0; inner < 16; ++inner) - fputc_unlocked (isascii (cp[inner]) && isprint (cp[inner]) + fputc (isascii (cp[inner]) && isprint (cp[inner]) ? cp[inner] : '.', stdout); - fputc_unlocked ('\n', stdout); + fputc ('\n', stdout); } printf (" %04zx ", cnt); @@ -601,14 +601,14 @@ show_full_content (Ebl *ebl, const char *fname, uint32_t shstrndx) for (inner = 2 * (16 - inner) + (16 - inner + 3) / 4 + 1; inner > 0; --inner) - fputc_unlocked (' ', stdout); + fputc (' ', stdout); for (inner = 0; inner < remaining; ++inner) - fputc_unlocked (isascii (cp[inner]) && isprint (cp[inner]) + fputc (isascii (cp[inner]) && isprint (cp[inner]) ? cp[inner] : '.', stdout); - fputc_unlocked ('\n', stdout); + fputc ('\n', stdout); - fputc_unlocked ('\n', stdout); + fputc ('\n', stdout); } } @@ -640,12 +640,12 @@ disasm_output (char *buf, size_t buflen, void *arg) printf ("%8" PRIx64 ": ", (uint64_t) info->addr); if (info->bytes_color != NULL) - fputs_unlocked (info->bytes_color, stdout); + fputs (info->bytes_color, stdout); size_t cnt; for (cnt = 0; cnt < (size_t) MIN (info->cur - info->last_end, 8); ++cnt) printf (" %02" PRIx8, info->last_end[cnt]); if (info->bytes_color != NULL) - fputs_unlocked (color_off, stdout); + fputs (color_off, stdout); printf ("%*s %.*s\n", (int) (8 - cnt) * 3 + 1, "", (int) buflen, buf); @@ -663,12 +663,12 @@ disasm_output (char *buf, size_t buflen, void *arg) printf ("%8" PRIx64 ": ", (uint64_t) info->addr); if (info->bytes_color != NULL) - fputs_unlocked (info->bytes_color, stdout); + fputs (info->bytes_color, stdout); for (; cnt < (size_t) (info->cur - info->last_end); ++cnt) printf (" %02" PRIx8, info->last_end[cnt]); if (info->bytes_color != NULL) - fputs_unlocked (color_off, stdout); - putchar_unlocked ('\n'); + fputs (color_off, stdout); + putchar ('\n'); info->addr += info->cur - info->last_end - 8; } diff --git a/src/readelf.c b/src/readelf.c index 21cacd7b6..3e97b64cb 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -1127,7 +1127,7 @@ print_file_type (unsigned short int e_type) static void print_ehdr (Ebl *ebl, GElf_Ehdr *ehdr) { - fputs_unlocked (_("ELF Header:\n Magic: "), stdout); + fputs (_("ELF Header:\n Magic: "), stdout); for (size_t cnt = 0; cnt < EI_NIDENT; ++cnt) printf (" %02hhx", ehdr->e_ident[cnt]); @@ -1154,7 +1154,7 @@ print_ehdr (Ebl *ebl, GElf_Ehdr *ehdr) printf (_(" ABI Version: %hhd\n"), ehdr->e_ident[EI_ABIVERSION]); - fputs_unlocked (_(" Type: "), stdout); + fputs (_(" Type: "), stdout); print_file_type (ehdr->e_type); const char *machine = dwelf_elf_e_machine_string (ehdr->e_machine); @@ -1196,9 +1196,9 @@ print_ehdr (Ebl *ebl, GElf_Ehdr *ehdr) printf (_(" (%" PRIu32 " in [0].sh_info)"), (uint32_t) shdr->sh_info); else - fputs_unlocked (_(" ([0] not available)"), stdout); + fputs (_(" ([0] not available)"), stdout); } - fputc_unlocked ('\n', stdout); + fputc ('\n', stdout); printf (_(" Size of section header entries: %" PRId16 " %s\n"), ehdr->e_shentsize, _("(bytes)")); @@ -1213,9 +1213,9 @@ print_ehdr (Ebl *ebl, GElf_Ehdr *ehdr) printf (_(" (%" PRIu32 " in [0].sh_size)"), (uint32_t) shdr->sh_size); else - fputs_unlocked (_(" ([0] not available)"), stdout); + fputs (_(" ([0] not available)"), stdout); } - fputc_unlocked ('\n', stdout); + fputc ('\n', stdout); if (unlikely (ehdr->e_shstrndx == SHN_XINDEX)) { @@ -1406,7 +1406,7 @@ There are %zd section headers, starting at offset %#" PRIx64 ":\n\ } } - fputc_unlocked ('\n', stdout); + fputc ('\n', stdout); } @@ -1552,22 +1552,22 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr) && shdr->sh_addr >= relro_from && shdr->sh_addr + shdr->sh_size <= relro_to) { - fputs_unlocked (" [RELRO:", stdout); + fputs (" [RELRO:", stdout); in_relro = true; } else if (has_relro && in_relro && shdr->sh_addr >= relro_to) { - fputs_unlocked ("]", stdout); + fputs ("]", stdout); in_relro = false; } else if (has_relro && in_relro && shdr->sh_addr + shdr->sh_size > relro_to) - fputs_unlocked ("] p_type == PT_LOAD && (phdr->p_flags & PF_W) == 0) { if (!in_ro) { - fputs_unlocked (" [RO:", stdout); + fputs (" [RO:", stdout); in_ro = true; } } @@ -1592,12 +1592,12 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr) { if ((phdr2->p_flags & PF_W) == 0 && !in_ro) { - fputs_unlocked (" [RO:", stdout); + fputs (" [RO:", stdout); in_ro = true; } else if ((phdr2->p_flags & PF_W) != 0 && in_ro) { - fputs_unlocked ("]", stdout); + fputs ("]", stdout); in_ro = false; } } @@ -1610,16 +1610,16 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr) if (has_relro && in_relro && shdr->sh_addr + shdr->sh_size > relro_to) { - fputs_unlocked (">", stdout); + fputs (">", stdout); in_relro = false; } } } if (in_relro || in_ro) - fputs_unlocked ("]", stdout); + fputs ("]", stdout); /* Finish the line. */ - fputc_unlocked ('\n', stdout); + fputc ('\n', stdout); } } @@ -1788,8 +1788,8 @@ print_flags (int class, GElf_Xword d_val, const struct flags *flags, if (d_val & flags[cnt].mask) { if (!first) - putchar_unlocked (' '); - fputs_unlocked (flags[cnt].str, stdout); + putchar (' '); + fputs (flags[cnt].str, stdout); d_val &= ~flags[cnt].mask; first = false; } @@ -1797,11 +1797,11 @@ print_flags (int class, GElf_Xword d_val, const struct flags *flags, if (d_val != 0) { if (!first) - putchar_unlocked (' '); + putchar (' '); printf ("%#0*" PRIx64, class == ELFCLASS32 ? 10 : 18, d_val); } - putchar_unlocked ('\n'); + putchar ('\n'); } @@ -1909,7 +1909,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr) phdr->p_offset); } - fputs_unlocked (_(" Type Value\n"), stdout); + fputs (_(" Type Value\n"), stdout); /* if --use-dynamic option is enabled, use the string table to get the related library info. */ @@ -1953,7 +1953,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, GElf_Phdr *phdr) case DT_BIND_NOW: case DT_TEXTREL: /* No further output. */ - fputc_unlocked ('\n', stdout); + fputc ('\n', stdout); break; case DT_NEEDED: @@ -2147,7 +2147,7 @@ handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr) elf_strptr (ebl->elf, shstrndx, shdr->sh_name), shdr->sh_offset, nentries); - fputs_unlocked (class == ELFCLASS32 + fputs (class == ELFCLASS32 ? _("\ Offset Type Value Name\n") : _("\ @@ -2336,7 +2336,7 @@ handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr) elf_strptr (ebl->elf, shstrndx, shdr->sh_name), shdr->sh_offset, nentries); - fputs_unlocked (class == ELFCLASS32 + fputs (class == ELFCLASS32 ? _("\ Offset Type Value Addend Name\n") : _("\ @@ -2795,7 +2795,7 @@ process_symtab (Ebl *ebl, unsigned int nsyms, Elf64_Word idx, } } - putchar_unlocked ('\n'); + putchar ('\n'); } } @@ -2877,7 +2877,7 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) (unsigned int) shdr->sh_link, elf_strptr (ebl->elf, shstrndx, glink->sh_name)); - fputs_unlocked (class == ELFCLASS32 + fputs (class == ELFCLASS32 ? _("\ Num: Value Size Type Bind Vis Ndx Name\n") : _("\ @@ -3553,12 +3553,12 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) { ssize_t n; case 0: - fputs_unlocked (_(" 0 *local* "), + fputs (_(" 0 *local* "), stdout); break; case 1: - fputs_unlocked (_(" 1 *global* "), + fputs (_(" 1 *global* "), stdout); break; @@ -3575,7 +3575,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) break; } } - putchar_unlocked ('\n'); + putchar ('\n'); } @@ -3623,7 +3623,7 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx, uint64_t success = 0; /* xgettext:no-c-format */ - fputs_unlocked (_("\ + fputs (_("\ Length Number % of total Coverage\n"), stdout); printf (_(" 0 %6" PRIu32 " %5.1f%%\n"), counts[0], (counts[0] * 100.0) / nbucket); @@ -4045,7 +4045,7 @@ print_attributes (Ebl *ebl, const GElf_Ehdr *ehdr) if (unlikely (*p++ != 'A')) return; - fputs_unlocked (_(" Owner Size\n"), stdout); + fputs (_(" Owner Size\n"), stdout); /* Loop over the sections. */ while (left (data, p) >= 4) @@ -7138,7 +7138,7 @@ print_encoding_base (const char *pfx, unsigned int fde_encoding) if (w & 0x70) { if (w != fde_encoding) - fputc_unlocked (' ', stdout); + fputc (' ', stdout); w = print_relinfo (w); } @@ -9678,7 +9678,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr, { get_uleb128 (u128, linep, lineendp); if (n != standard_opcode_lengths[opcode]) - putc_unlocked (',', stdout); + fputc (',', stdout); printf (" %u", u128); } @@ -10431,7 +10431,7 @@ print_debug_macinfo_section (Dwfl_Module *dwflmod __attribute__ ((unused)), \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"), elf_ndxscn (scn), section_name (ebl, shdr), (uint64_t) shdr->sh_offset); - putc_unlocked ('\n', stdout); + fputc ('\n', stdout); /* There is no function in libdw to iterate over the raw content of the section but it is easy enough to do. */ @@ -10593,7 +10593,7 @@ print_debug_macro_section (Dwfl_Module *dwflmod __attribute__ ((unused)), \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"), elf_ndxscn (scn), section_name (ebl, shdr), (uint64_t) shdr->sh_offset); - putc_unlocked ('\n', stdout); + fputc ('\n', stdout); /* Get the source file information for all CUs. Uses same datastructure as macinfo. But uses offset field to directly @@ -10746,15 +10746,15 @@ print_debug_macro_section (Dwfl_Module *dwflmod __attribute__ ((unused)), goto invalid_data; args--; if (args > 0) - putchar_unlocked (','); + putchar (','); } } else printf (_(" no arguments.")); - putchar_unlocked ('\n'); + putchar ('\n'); } } - putchar_unlocked ('\n'); + putchar ('\n'); int level = 1; if (readp + 1 > readendp) @@ -10923,14 +10923,14 @@ print_debug_macro_section (Dwfl_Module *dwflmod __attribute__ ((unused)), if (args > 0) printf (", "); } - putchar_unlocked ('\n'); + putchar ('\n'); } if (readp + 1 > readendp) goto invalid_data; opcode = *readp++; if (opcode == 0) - putchar_unlocked ('\n'); + putchar ('\n'); } } } @@ -11266,7 +11266,7 @@ print_debug_frame_hdr_section (Dwfl_Module *dwflmod __attribute__ ((unused)), /* +4 because of the 4 byte header of the section. */ (uint64_t) shdr->sh_offset + 4 + eh_frame_ptr); - putchar_unlocked ('\n'); + putchar ('\n'); } uint64_t fde_count = 0; @@ -11444,7 +11444,7 @@ print_debug_exception_table (Dwfl_Module *dwflmod __attribute__ ((unused)), else if (ar_disp != 0) puts (" -> ???"); else - putchar_unlocked ('\n'); + putchar ('\n'); ++u; } while (readp < action_table_end); @@ -13098,19 +13098,19 @@ handle_core_note (Ebl *ebl, const GElf_Nhdr *nhdr, nregloc == 0 ? nhdr->n_descsz : 0, items, nitems); if (colno != 0) - putchar_unlocked ('\n'); + putchar ('\n'); colno = handle_core_registers (ebl, ebl->elf, desc + regs_offset, reglocs, nregloc); if (colno != 0) - putchar_unlocked ('\n'); + putchar ('\n'); } static void handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr, GElf_Off start, Elf_Data *data) { - fputs_unlocked (_(" Owner Data size Type\n"), stdout); + fputs (_(" Owner Data size Type\n"), stdout); if (data == NULL) goto bad_note; diff --git a/src/size.c b/src/size.c index ff8ca0753..2985bc09b 100644 --- a/src/size.c +++ b/src/size.c @@ -411,7 +411,7 @@ show_sysv (Elf *elf, const char *prefix, const char *fname, maxlen = MAX (maxlen, (int) strlen (name)); } - fputs_unlocked (fname, stdout); + fputs (fname, stdout); if (prefix != NULL) printf (_(" (ex %s)"), prefix); printf (":\n%-*s %*s %*s\n", @@ -483,7 +483,7 @@ show_sysv_one_line (Elf *elf) continue; if (! first) - fputs_unlocked (" + ", stdout); + fputs (" + ", stdout); first = false; printf ((radix == radix_hex ? "%" PRIx64 "(%s)" @@ -555,7 +555,7 @@ show_bsd (Elf *elf, const char *prefix, const char *fname, fname); if (prefix != NULL) printf (_(" (ex %s)"), prefix); - fputs_unlocked ("\n", stdout); + fputs ("\n", stdout); total_textsize += textsize; total_datasize += datasize; @@ -607,7 +607,7 @@ show_segments (Elf *elf, const char *fullname) continue; if (! first) - fputs_unlocked (" + ", stdout); + fputs (" + ", stdout); first = false; printf (radix == radix_hex ? "%" PRIx64 "(%c%c%c)" diff --git a/src/strings.c b/src/strings.c index 69d09ccf5..fe0f3a484 100644 --- a/src/strings.c +++ b/src/strings.c @@ -345,8 +345,8 @@ process_chunk_mb (const char *fname, const unsigned char *buf, off_t to, /* We found a match. */ if (unlikely (fname != NULL)) { - fputs_unlocked (fname, stdout); - fputs_unlocked (": ", stdout); + fputs (fname, stdout); + fputs (": ", stdout); } if (unlikely (radix != radix_none)) @@ -357,7 +357,7 @@ process_chunk_mb (const char *fname, const unsigned char *buf, off_t to, if (unlikely (*unprinted != NULL)) { - fputs_unlocked (*unprinted, stdout); + fputs (*unprinted, stdout); free (*unprinted); *unprinted = NULL; } @@ -366,8 +366,8 @@ process_chunk_mb (const char *fname, const unsigned char *buf, off_t to, assume the file data is encoded in UCS-2/UTF-16 or UCS-4/UTF-32 respectively we could convert the string. But there is no such guarantee. */ - fwrite_unlocked (start, 1, buf - start, stdout); - putc_unlocked ('\n', stdout); + fwrite (start, 1, buf - start, stdout); + fputc ('\n', stdout); } start = ++buf; @@ -413,8 +413,8 @@ process_chunk (const char *fname, const unsigned char *buf, off_t to, /* We found a match. */ if (likely (fname != NULL)) { - fputs_unlocked (fname, stdout); - fputs_unlocked (": ", stdout); + fputs (fname, stdout); + fputs (": ", stdout); } if (likely (radix != radix_none)) @@ -425,12 +425,12 @@ process_chunk (const char *fname, const unsigned char *buf, off_t to, if (unlikely (*unprinted != NULL)) { - fputs_unlocked (*unprinted, stdout); + fputs (*unprinted, stdout); free (*unprinted); *unprinted = NULL; } - fwrite_unlocked (start, 1, buf - start, stdout); - putc_unlocked ('\n', stdout); + fwrite (start, 1, buf - start, stdout); + fputc ('\n', stdout); } start = ++buf; diff --git a/tests/showptable.c b/tests/showptable.c index a794b0e88..3d0552fe7 100644 --- a/tests/showptable.c +++ b/tests/showptable.c @@ -111,11 +111,11 @@ main (int argc, char *argv[]) (unsigned long long int) phdr->p_memsz, (unsigned long long int) phdr->p_align); - putc_unlocked ((phdr->p_flags & PF_X) ? 'X' : ' ', stdout); - putc_unlocked ((phdr->p_flags & PF_W) ? 'W' : ' ', stdout); - putc_unlocked ((phdr->p_flags & PF_R) ? 'R' : ' ', stdout); + fputc ((phdr->p_flags & PF_X) ? 'X' : ' ', stdout); + fputc ((phdr->p_flags & PF_W) ? 'W' : ' ', stdout); + fputc ((phdr->p_flags & PF_R) ? 'R' : ' ', stdout); - putc_unlocked ('\n', stdout); + fputc ('\n', stdout); if (phdr->p_type == PT_INTERP) {