warn unused result for bfd IO functions

This patch fixes all the warnings I found in bfd, binutils and ld,
plus some bitrotted COFF_GO32 code that tried to allocate -168ul
bytes.  When the malloc fail was reported these testsuite fails
resulted:

i386-go32  +FAIL: go32 stub
i386-go32  +ERROR: tcl error sourcing /home/alan/src/binutils-gdb/ld/testsuite/ld-i386/i386.exp.
i386-go32  +ERROR: couldn't open "tmpdir/go32stub": no such file or directory
i386-go32  +FAIL: ld-scripts/sane1
i386-go32  +FAIL: ld-scripts/assign-loc
i386-go32  +FAIL: ld-scripts/pr18963

This does result in some warnings in gdb which are fixed in a followup
patch.

bfd/
	* bfdio.c (bfd_read, bfd_write): Add ATTRIBUTE_WARN_UNUSED_RESULT.
	(bfd_tell, bfd_stat, bfd_seek, bfd_mmap): Likewise.
	* bfd-in2.h: Regenerate.
	* coff-rs6000.c (xcoff_write_armap_big) Don't ignore bfd_write
	return value.
	(xcoff_generate_rtinit): Likewise.  Also free data_buffer and
	string_table before returning.
	* coff64-rs6000.c (xcoff64_generate_rtinit): Likewise.
	* coff-stgo32.c (go32exe_check_format): Don't ignore bfd_seek
	return value.
	* coffcode.h (coff_apply_checksum): Don't ignore bfd_write return.
	(coff_write_object_contents <COFF_GO32>): Likewise, and bfd_malloc.
	Fix bitrotted code to look for first section with non-zero filepos.
	* elf64-ia64-vms.c (elf64_vms_write_shdrs_and_ehdr): Don't ignore
	bfd_seek or bfd_write return values.
	* pef.c (bfd_pef_scan_section): Likewise.
	(bfd_pef_read_header, bfd_pef_xlib_read_header): Likewise.
	* vms-misc.c (_bfd_vms_output_end): Likewise.  Return status.
	* vms.h (_bfd_vms_output_end): Update prototype.
	* vms-alpha.c: Pass _bfd_vms_output_end status up call chains.
	* wasm-module.c (wasm_compute_custom_section_file_position): Don't
	ignore bfd_seek or bfd_write return values.
	(wasm_compute_section_file_positions): Likewise.
	* xsym.c (bfd_sym_scan): Don't ignore bfd_seek return value.
	(bfd_sym_read_name_table): Likewise.
binutils/
	* ar.c (print_contents, extract_file): Don't ignore bfd_seek
	return value.
ld/
	* pdb.c (create_section_contrib_substream): Don't ignore bfd_seek
	return value.
	(create_section_header_stream): Likewise.
	* pe-dll.c (pe_get16, pe_get32): Add fail param to return results
	from bfd_seek and bfd_read.
	(pe_implied_import_dll): Handle these fails, and other bfd_seek
	and bfd_read return values.
This commit is contained in:
Alan Modra 2023-08-07 20:59:08 +09:30
parent 934ee74bc0
commit e416bd75c3
16 changed files with 250 additions and 159 deletions

View File

@ -2722,17 +2722,19 @@ bfd_vma bfd_emul_get_commonpagesize (const char *);
char *bfd_demangle (bfd *, const char *, int);
/* Extracted from bfdio.c. */
bfd_size_type bfd_read (void *, bfd_size_type, bfd *);
bfd_size_type bfd_read (void *, bfd_size_type, bfd *)
ATTRIBUTE_WARN_UNUSED_RESULT;
bfd_size_type bfd_write (const void *, bfd_size_type, bfd *);
bfd_size_type bfd_write (const void *, bfd_size_type, bfd *)
ATTRIBUTE_WARN_UNUSED_RESULT;
file_ptr bfd_tell (bfd *);
file_ptr bfd_tell (bfd *) ATTRIBUTE_WARN_UNUSED_RESULT;
int bfd_flush (bfd *);
int bfd_stat (bfd *, struct stat *);
int bfd_stat (bfd *, struct stat *) ATTRIBUTE_WARN_UNUSED_RESULT;
int bfd_seek (bfd *, file_ptr, int);
int bfd_seek (bfd *, file_ptr, int) ATTRIBUTE_WARN_UNUSED_RESULT;
long bfd_get_mtime (bfd *abfd);
@ -2742,7 +2744,8 @@ ufile_ptr bfd_get_file_size (bfd *abfd);
void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
int prot, int flags, file_ptr offset,
void **map_addr, bfd_size_type *map_len);
void **map_addr, bfd_size_type *map_len)
ATTRIBUTE_WARN_UNUSED_RESULT;
/* Extracted from bfdwin.c. */
struct _bfd_window_internal;

View File

@ -234,7 +234,8 @@ FUNCTION
bfd_read
SYNOPSIS
bfd_size_type bfd_read (void *, bfd_size_type, bfd *);
bfd_size_type bfd_read (void *, bfd_size_type, bfd *)
ATTRIBUTE_WARN_UNUSED_RESULT;
DESCRIPTION
Attempt to read SIZE bytes from ABFD's iostream to PTR.
@ -299,7 +300,8 @@ FUNCTION
bfd_write
SYNOPSIS
bfd_size_type bfd_write (const void *, bfd_size_type, bfd *);
bfd_size_type bfd_write (const void *, bfd_size_type, bfd *)
ATTRIBUTE_WARN_UNUSED_RESULT;
DESCRIPTION
Attempt to write SIZE bytes to ABFD's iostream from PTR.
@ -347,7 +349,7 @@ FUNCTION
bfd_tell
SYNOPSIS
file_ptr bfd_tell (bfd *);
file_ptr bfd_tell (bfd *) ATTRIBUTE_WARN_UNUSED_RESULT;
DESCRIPTION
Return ABFD's iostream file position.
@ -404,7 +406,7 @@ FUNCTION
bfd_stat
SYNOPSIS
int bfd_stat (bfd *, struct stat *);
int bfd_stat (bfd *, struct stat *) ATTRIBUTE_WARN_UNUSED_RESULT;
DESCRIPTION
Call fstat on ABFD's iostream. Return 0 on success, and a
@ -437,7 +439,7 @@ FUNCTION
bfd_seek
SYNOPSIS
int bfd_seek (bfd *, file_ptr, int);
int bfd_seek (bfd *, file_ptr, int) ATTRIBUTE_WARN_UNUSED_RESULT;
DESCRIPTION
Call fseek on ABFD's iostream. Return 0 on success, and a
@ -638,7 +640,8 @@ FUNCTION
SYNOPSIS
void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
int prot, int flags, file_ptr offset,
void **map_addr, bfd_size_type *map_len);
void **map_addr, bfd_size_type *map_len)
ATTRIBUTE_WARN_UNUSED_RESULT;
DESCRIPTION
Return mmap()ed region of the file, if possible and implemented.

View File

@ -2193,8 +2193,12 @@ xcoff_write_armap_big (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
}
}
bfd_write (symbol_table, symbol_table_size, abfd);
if (bfd_write (symbol_table, symbol_table_size, abfd)
!= symbol_table_size)
{
free (symbol_table);
return false;
}
free (symbol_table);
prevoff = nextoff;
@ -2273,8 +2277,12 @@ xcoff_write_armap_big (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
}
}
bfd_write (symbol_table, symbol_table_size, abfd);
if (bfd_write (symbol_table, symbol_table_size, abfd)
!= symbol_table_size)
{
free (symbol_table);
return false;
}
free (symbol_table);
PRINT20 (fhdr->symoff64, nextoff);
@ -4204,7 +4212,10 @@ xcoff_generate_rtinit (bfd *abfd, const char *init, const char *fini,
string_table_size += 4;
string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
if (string_table == NULL)
return false;
{
free (data_buffer);
return false;
}
val = string_table_size;
bfd_h_put_32 (abfd, val, &string_table[0]);
@ -4354,18 +4365,21 @@ xcoff_generate_rtinit (bfd *abfd, const char *init, const char *fini,
filehdr.f_symptr = scnhdr.s_relptr + scnhdr.s_nreloc * RELSZ;
bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
bfd_write (filehdr_ext, FILHSZ, abfd);
bfd_coff_swap_scnhdr_out (abfd, &scnhdr, scnhdr_ext);
bfd_write (scnhdr_ext, SCNHSZ, abfd);
bfd_write (data_buffer, data_buffer_size, abfd);
bfd_write (reloc_ext, scnhdr.s_nreloc * RELSZ, abfd);
bfd_write (syment_ext, filehdr.f_nsyms * SYMESZ, abfd);
bfd_write (string_table, string_table_size, abfd);
bool ret = true;
if (bfd_write (filehdr_ext, FILHSZ, abfd) != FILHSZ
|| bfd_write (scnhdr_ext, SCNHSZ, abfd) != SCNHSZ
|| bfd_write (data_buffer, data_buffer_size, abfd) != data_buffer_size
|| (bfd_write (reloc_ext, scnhdr.s_nreloc * RELSZ, abfd)
!= scnhdr.s_nreloc * RELSZ)
|| (bfd_write (syment_ext, filehdr.f_nsyms * SYMESZ, abfd)
!= (bfd_size_type) filehdr.f_nsyms * SYMESZ)
|| bfd_write (string_table, string_table_size, abfd) != string_table_size)
ret = false;
free (string_table);
free (data_buffer);
data_buffer = NULL;
return true;
return ret;
}

View File

@ -299,7 +299,8 @@ go32exe_check_format (bfd *abfd)
/* Save now the stub to be used later. Put the stub data to a temporary
location first as tdata still does not exist. It may not even
be ever created if we are just checking the file format of ABFD. */
bfd_seek (abfd, 0, SEEK_SET);
if (bfd_seek (abfd, 0, SEEK_SET) != 0)
goto fail;
go32exe_temp_stub = bfd_malloc (stubsize);
if (go32exe_temp_stub == NULL)
goto fail;

View File

@ -2232,7 +2232,10 @@ xcoff64_generate_rtinit (bfd *abfd, const char *init, const char *fini,
string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
if (string_table == NULL)
return false;
{
free (data_buffer);
return false;
}
val = string_table_size;
bfd_put_32 (abfd, val, &string_table[0]);
@ -2383,20 +2386,23 @@ xcoff64_generate_rtinit (bfd *abfd, const char *init, const char *fini,
filehdr.f_symptr = data_scnhdr.s_relptr + data_scnhdr.s_nreloc * RELSZ;
bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
bfd_write (filehdr_ext, FILHSZ, abfd);
bfd_coff_swap_scnhdr_out (abfd, &text_scnhdr, &scnhdr_ext[SCNHSZ * 0]);
bfd_coff_swap_scnhdr_out (abfd, &data_scnhdr, &scnhdr_ext[SCNHSZ * 1]);
bfd_coff_swap_scnhdr_out (abfd, &bss_scnhdr, &scnhdr_ext[SCNHSZ * 2]);
bfd_write (scnhdr_ext, 3 * SCNHSZ, abfd);
bfd_write (data_buffer, data_buffer_size, abfd);
bfd_write (reloc_ext, data_scnhdr.s_nreloc * RELSZ, abfd);
bfd_write (syment_ext, filehdr.f_nsyms * SYMESZ, abfd);
bfd_write (string_table, string_table_size, abfd);
bool ret = true;
if (bfd_write (filehdr_ext, FILHSZ, abfd) != FILHSZ
|| bfd_write (scnhdr_ext, 3 * SCNHSZ, abfd) != 3 * SCNHSZ
|| bfd_write (data_buffer, data_buffer_size, abfd) != data_buffer_size
|| (bfd_write (reloc_ext, data_scnhdr.s_nreloc * RELSZ, abfd)
!= data_scnhdr.s_nreloc * RELSZ)
|| (bfd_write (syment_ext, filehdr.f_nsyms * SYMESZ, abfd)
!= (bfd_size_type) filehdr.f_nsyms * SYMESZ)
|| bfd_write (string_table, string_table_size, abfd) != string_table_size)
ret = false;
free (string_table);
free (data_buffer);
data_buffer = NULL;
return true;
return ret;
}
/* The typical dynamic reloc. */

View File

@ -3411,7 +3411,8 @@ coff_apply_checksum (bfd *abfd)
return false;
checksum = 0;
bfd_write (&checksum, 4, abfd);
if (bfd_write (&checksum, 4, abfd) != 4)
return false;
if (bfd_seek (abfd, peheader, SEEK_SET) != 0)
return false;
@ -3423,9 +3424,7 @@ coff_apply_checksum (bfd *abfd)
if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
return false;
bfd_write (&checksum, 4, abfd);
return true;
return bfd_write (&checksum, 4, abfd) == 4;
}
#endif /* COFF_IMAGE_WITH_PE */
@ -3885,16 +3884,28 @@ coff_write_object_contents (bfd * abfd)
#if defined (COFF_GO32_EXE) || defined (COFF_GO32)
/* Pad section headers. */
if ((abfd->flags & EXEC_P) && abfd->sections != NULL)
if ((abfd->flags & EXEC_P) != 0)
{
file_ptr cur_ptr = scn_base
+ abfd->section_count * bfd_coff_scnhsz (abfd);
long fill_size = (abfd->sections->filepos - cur_ptr);
bfd_byte *b = bfd_zmalloc (fill_size);
if (b)
asection *s = abfd->sections;
while (s != NULL && s->filepos == 0)
s = s->next;
if (s != NULL)
{
bfd_write (b, fill_size, abfd);
free (b);
file_ptr cur_ptr
= scn_base + abfd->section_count * bfd_coff_scnhsz (abfd);
file_ptr fill_size = s->filepos - cur_ptr;
if (fill_size > 0)
{
bfd_byte *b = bfd_zmalloc (fill_size);
if (!b)
return false;
if (bfd_write (b, fill_size, abfd) != (ufile_ptr) fill_size)
{
free (b);
return false;
}
free (b);
}
}
}
#endif

View File

@ -4712,6 +4712,7 @@ elf64_vms_write_shdrs_and_ehdr (bfd *abfd)
static bool
elf64_vms_close_and_cleanup (bfd *abfd)
{
bool ret = true;
if (bfd_get_format (abfd) == bfd_object)
{
long isize;
@ -4720,15 +4721,16 @@ elf64_vms_close_and_cleanup (bfd *abfd)
isize = bfd_get_size (abfd);
if ((isize & 7) != 0)
{
int ishort = 8 - (isize & 7);
unsigned int ishort = 8 - (isize & 7);
uint64_t pad = 0;
bfd_seek (abfd, isize, SEEK_SET);
bfd_write (&pad, ishort, abfd);
if (bfd_seek (abfd, isize, SEEK_SET) != 0
|| bfd_write (&pad, ishort, abfd) != ishort)
ret = false;
}
}
return _bfd_generic_close_and_cleanup (abfd);
return _bfd_generic_close_and_cleanup (abfd) && ret;
}
/* Add symbols from an ELF object file to the linker hash table. */

View File

@ -386,8 +386,8 @@ bfd_pef_scan_section (bfd *abfd, bfd_pef_section *section)
{
unsigned char buf[28];
bfd_seek (abfd, section->header_offset, SEEK_SET);
if (bfd_read (buf, 28, abfd) != 28)
if (bfd_seek (abfd, section->header_offset, SEEK_SET) != 0
|| bfd_read (buf, 28, abfd) != 28)
return -1;
section->name_offset = bfd_h_get_32 (abfd, buf);
@ -568,9 +568,8 @@ bfd_pef_read_header (bfd *abfd, bfd_pef_header *header)
{
unsigned char buf[40];
bfd_seek (abfd, 0, SEEK_SET);
if (bfd_read (buf, 40, abfd) != 40)
if (bfd_seek (abfd, 0, SEEK_SET) != 0
|| bfd_read (buf, 40, abfd) != 40)
return -1;
header->tag1 = bfd_getb32 (buf);
@ -1072,9 +1071,8 @@ bfd_pef_xlib_read_header (bfd *abfd, bfd_pef_xlib_header *header)
{
unsigned char buf[80];
bfd_seek (abfd, 0, SEEK_SET);
if (bfd_read (buf, sizeof buf, abfd) != sizeof buf)
if (bfd_seek (abfd, 0, SEEK_SET) != 0
|| bfd_read (buf, sizeof buf, abfd) != sizeof buf)
return -1;
header->tag1 = bfd_getb32 (buf);

View File

@ -2923,7 +2923,7 @@ alpha_vms_object_p (bfd *abfd)
/* Write an EMH/MHD record. */
static void
static bool
_bfd_vms_write_emh (bfd *abfd)
{
struct vms_rec_wr *recwr = &PRIV (recwr);
@ -2952,12 +2952,12 @@ _bfd_vms_write_emh (bfd *abfd)
_bfd_vms_output_counted (recwr, BFD_VERSION_STRING);
_bfd_vms_output_dump (recwr, get_vms_time_string (tbuf), EMH_DATE_LENGTH);
_bfd_vms_output_fill (recwr, 0, EMH_DATE_LENGTH);
_bfd_vms_output_end (abfd, recwr);
return _bfd_vms_output_end (abfd, recwr);
}
/* Write an EMH/LMN record. */
static void
static bool
_bfd_vms_write_lmn (bfd *abfd, const char *name)
{
char version [64];
@ -2970,7 +2970,7 @@ _bfd_vms_write_lmn (bfd *abfd, const char *name)
snprintf (version, sizeof (version), "%s %d.%d.%d", name,
ver / 10000, (ver / 100) % 100, ver % 100);
_bfd_vms_output_dump (recwr, (unsigned char *)version, strlen (version));
_bfd_vms_output_end (abfd, recwr);
return _bfd_vms_output_end (abfd, recwr);
}
@ -3008,8 +3008,7 @@ _bfd_vms_write_eeom (bfd *abfd)
_bfd_vms_output_long (recwr, 0);
}
_bfd_vms_output_end (abfd, recwr);
return true;
return _bfd_vms_output_end (abfd, recwr);
}
static void *
@ -3484,8 +3483,9 @@ alpha_vms_write_exec (bfd *abfd)
struct vms_rec_wr *recwr = &PRIV (recwr);
unsigned int i;
_bfd_vms_write_emh (abfd);
_bfd_vms_write_lmn (abfd, "GNU LD");
if (!_bfd_vms_write_emh (abfd)
|| !_bfd_vms_write_lmn (abfd, "GNU LD"))
return false;
/* PSC for the absolute section. */
_bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
@ -3496,7 +3496,8 @@ alpha_vms_write_exec (bfd *abfd)
_bfd_vms_output_long (recwr, 0);
_bfd_vms_output_counted (recwr, ".$$ABS$$.");
_bfd_vms_output_end_subrec (recwr);
_bfd_vms_output_end (abfd, recwr);
if (!_bfd_vms_output_end (abfd, recwr))
return false;
for (i = 0; i < PRIV (gsd_sym_count); i++)
{
@ -3529,11 +3530,13 @@ alpha_vms_write_exec (bfd *abfd)
_bfd_vms_output_long (recwr, 0);
_bfd_vms_output_counted (recwr, sym->name);
_bfd_vms_output_end_subrec (recwr);
if ((i % 5) == 4)
_bfd_vms_output_end (abfd, recwr);
if ((i % 5) == 4
&& !_bfd_vms_output_end (abfd, recwr))
return false;
}
if ((i % 5) != 0)
_bfd_vms_output_end (abfd, recwr);
if ((i % 5) != 0
&& !_bfd_vms_output_end (abfd, recwr))
return false;
if (!_bfd_vms_write_eeom (abfd))
return false;
@ -3591,7 +3594,8 @@ _bfd_vms_write_egsd (bfd *abfd)
/* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
if (_bfd_vms_output_check (recwr, 64) < 0)
{
_bfd_vms_output_end (abfd, recwr);
if (!_bfd_vms_output_end (abfd, recwr))
return false;
_bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
_bfd_vms_output_long (recwr, 0);
}
@ -3687,7 +3691,8 @@ _bfd_vms_write_egsd (bfd *abfd)
bytes for a possible ABS section. */
if (_bfd_vms_output_check (recwr, 80 + 16) < 0)
{
_bfd_vms_output_end (abfd, recwr);
if (!_bfd_vms_output_end (abfd, recwr))
return false;
_bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
_bfd_vms_output_long (recwr, 0);
}
@ -3766,9 +3771,7 @@ _bfd_vms_write_egsd (bfd *abfd)
}
_bfd_vms_output_alignment (recwr, 8);
_bfd_vms_output_end (abfd, recwr);
return true;
return _bfd_vms_output_end (abfd, recwr);
}
/* Write object header for bfd abfd. Return FALSE on error. */
@ -3784,8 +3787,9 @@ _bfd_vms_write_ehdr (bfd *abfd)
_bfd_vms_output_alignment (recwr, 2);
_bfd_vms_write_emh (abfd);
_bfd_vms_write_lmn (abfd, "GNU AS");
if (!_bfd_vms_write_emh (abfd)
|| !_bfd_vms_write_lmn (abfd, "GNU AS"))
return false;
/* SRC. */
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
@ -3806,13 +3810,15 @@ _bfd_vms_write_ehdr (bfd *abfd)
if (symnum == abfd->symcount)
_bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("noname"));
_bfd_vms_output_end (abfd, recwr);
if (!_bfd_vms_output_end (abfd, recwr))
return false;
/* TTL. */
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
_bfd_vms_output_short (recwr, EMH__C_TTL);
_bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("TTL"));
_bfd_vms_output_end (abfd, recwr);
if (!_bfd_vms_output_end (abfd, recwr))
return false;
/* CPR. */
_bfd_vms_output_begin (recwr, EOBJ__C_EMH);
@ -3820,9 +3826,7 @@ _bfd_vms_write_ehdr (bfd *abfd)
_bfd_vms_output_dump (recwr,
(unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
39);
_bfd_vms_output_end (abfd, recwr);
return true;
return _bfd_vms_output_end (abfd, recwr);
}
/* Part 4.6, relocations. */
@ -3834,12 +3838,12 @@ _bfd_vms_write_ehdr (bfd *abfd)
/* Close the etir/etbt record. */
static void
static bool
end_etir_record (bfd * abfd)
{
struct vms_rec_wr *recwr = &PRIV (recwr);
_bfd_vms_output_end (abfd, recwr);
return _bfd_vms_output_end (abfd, recwr);
}
static void
@ -3885,7 +3889,7 @@ start_etir_or_etbt_record (bfd *abfd, asection *section, bfd_vma offset)
/* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
address VADDR in section specified by SEC_INDEX and NAME. */
static void
static bool
sto_imm (bfd *abfd, asection *section,
bfd_size_type ssize, unsigned char *cptr, bfd_vma vaddr)
{
@ -3905,7 +3909,8 @@ sto_imm (bfd *abfd, asection *section,
if (_bfd_vms_output_check (recwr, size) < 0)
{
/* Doesn't fit, split ! */
end_etir_record (abfd);
if (!end_etir_record (abfd))
return false;
start_etir_or_etbt_record (abfd, section, vaddr);
@ -3928,17 +3933,20 @@ sto_imm (bfd *abfd, asection *section,
cptr += size;
ssize -= size;
}
return true;
}
static void
static bool
etir_output_check (bfd *abfd, asection *section, bfd_vma vaddr, int checklen)
{
if (_bfd_vms_output_check (&PRIV (recwr), checklen) < 0)
{
/* Not enough room in this record. Close it and open a new one. */
end_etir_record (abfd);
if (!end_etir_record (abfd))
return false;
start_etir_or_etbt_record (abfd, section, vaddr);
}
return true;
}
/* Return whether RELOC must be deferred till the end. */
@ -4056,7 +4064,8 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
_bfd_error_handler (_("size error in section %pA"),
section);
size = addr - curr_addr;
sto_imm (abfd, section, size, curr_data, curr_addr);
if (!sto_imm (abfd, section, size, curr_data, curr_addr))
return false;
curr_data += size;
curr_addr += size;
}
@ -4073,7 +4082,8 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
{
bfd_vma addend = rptr->addend;
slen = strlen ((char *) sym->name);
etir_output_check (abfd, section, curr_addr, slen);
if (!etir_output_check (abfd, section, curr_addr, slen))
return false;
if (addend)
{
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
@ -4097,7 +4107,8 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
}
else if (bfd_is_abs_section (sym->section))
{
etir_output_check (abfd, section, curr_addr, 16);
if (!etir_output_check (abfd, section, curr_addr, 16))
return false;
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
_bfd_vms_output_long (recwr, (unsigned long) sym->value);
_bfd_vms_output_end_subrec (recwr);
@ -4106,7 +4117,8 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
}
else
{
etir_output_check (abfd, section, curr_addr, 32);
if (!etir_output_check (abfd, section, curr_addr, 32))
return false;
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
_bfd_vms_output_long (recwr,
(unsigned long) sec->target_index);
@ -4126,7 +4138,8 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
{
bfd_vma addend = rptr->addend;
slen = strlen ((char *) sym->name);
etir_output_check (abfd, section, curr_addr, slen);
if (!etir_output_check (abfd, section, curr_addr, slen))
return false;
if (addend)
{
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
@ -4149,7 +4162,8 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
}
else if (bfd_is_abs_section (sym->section))
{
etir_output_check (abfd, section, curr_addr, 16);
if (!etir_output_check (abfd, section, curr_addr, 16))
return false;
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
_bfd_vms_output_quad (recwr, sym->value);
_bfd_vms_output_end_subrec (recwr);
@ -4158,7 +4172,8 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
}
else
{
etir_output_check (abfd, section, curr_addr, 32);
if (!etir_output_check (abfd, section, curr_addr, 32))
return false;
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
_bfd_vms_output_long (recwr,
(unsigned long) sec->target_index);
@ -4170,12 +4185,14 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
break;
case ALPHA_R_HINT:
sto_imm (abfd, section, size, curr_data, curr_addr);
if (!sto_imm (abfd, section, size, curr_data, curr_addr))
return false;
break;
case ALPHA_R_LINKAGE:
size = 16;
etir_output_check (abfd, section, curr_addr, 64);
if (!etir_output_check (abfd, section, curr_addr, 64))
return false;
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LP_PSB);
_bfd_vms_output_long
(recwr, (unsigned long) rptr->addend);
@ -4188,7 +4205,8 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
case ALPHA_R_CODEADDR:
slen = strlen ((char *) sym->name);
etir_output_check (abfd, section, curr_addr, slen);
if (!etir_output_check (abfd, section, curr_addr, slen))
return false;
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_CA);
_bfd_vms_output_counted (recwr, sym->name);
_bfd_vms_output_end_subrec (recwr);
@ -4197,8 +4215,9 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
case ALPHA_R_NOP:
udata
= (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
etir_output_check (abfd, section, curr_addr,
32 + 1 + strlen (udata->origname));
if (!etir_output_check (abfd, section, curr_addr,
32 + 1 + strlen (udata->origname)))
return false;
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_NOP_GBL);
_bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
_bfd_vms_output_long
@ -4219,8 +4238,9 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
case ALPHA_R_LDA:
udata
= (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
etir_output_check (abfd, section, curr_addr,
32 + 1 + strlen (udata->origname));
if (!etir_output_check (abfd, section, curr_addr,
32 + 1 + strlen (udata->origname)))
return false;
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LDA_GBL);
_bfd_vms_output_long
(recwr, (unsigned long) udata->lkindex + 1);
@ -4238,8 +4258,9 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
case ALPHA_R_BOH:
udata
= (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
etir_output_check (abfd, section, curr_addr,
32 + 1 + strlen (udata->origname));
if (!etir_output_check (abfd, section, curr_addr,
32 + 1 + strlen (udata->origname)))
return false;
_bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_BOH_GBL);
_bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
_bfd_vms_output_long
@ -4272,7 +4293,8 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
return false;
}
size = section->size - curr_addr;
sto_imm (abfd, section, size, curr_data, curr_addr);
if (!sto_imm (abfd, section, size, curr_data, curr_addr))
return false;
curr_data += size;
curr_addr += size;
@ -4285,9 +4307,11 @@ _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
}
else /* (section->flags & SEC_RELOC) */
sto_imm (abfd, section, section->size, section->contents, 0);
if (!sto_imm (abfd, section, section->size, section->contents, 0))
return false;
end_etir_record (abfd);
if (!end_etir_record (abfd))
return false;
}
_bfd_vms_output_alignment (recwr, 2);

View File

@ -269,7 +269,7 @@ _bfd_vms_output_end_subrec (struct vms_rec_wr *recwr)
/* Ends current record (and write it). */
void
bool
_bfd_vms_output_end (bfd *abfd, struct vms_rec_wr *recwr)
{
vms_debug2 ((6, "_bfd_vms_output_end (size %u)\n", recwr->size));
@ -278,7 +278,7 @@ _bfd_vms_output_end (bfd *abfd, struct vms_rec_wr *recwr)
BFD_ASSERT (recwr->subrec_offset == 0);
if (recwr->size == 0)
return;
return true;
_bfd_vms_output_align (recwr, recwr->size);
@ -289,16 +289,20 @@ _bfd_vms_output_end (bfd *abfd, struct vms_rec_wr *recwr)
converted to variable length (VAR) format. VAR format has a length
word first which must be explicitly output in UDF format. */
/* So, first the length word. */
bfd_write (recwr->buf + 2, 2, abfd);
if (bfd_write (recwr->buf + 2, 2, abfd) != 2)
return false;
/* Align. */
if (recwr->size & 1)
recwr->buf[recwr->size++] = 0;
/* Then the record. */
bfd_write (recwr->buf, (size_t) recwr->size, abfd);
if (bfd_write (recwr->buf, (size_t) recwr->size, abfd)
!= (size_t) recwr->size)
return false;
recwr->size = 0;
return true;
}
/* Check remaining buffer size. Return what's left. */

View File

@ -124,7 +124,7 @@ extern void _bfd_vms_output_begin (struct vms_rec_wr *, int);
extern void _bfd_vms_output_alignment (struct vms_rec_wr *, int);
extern void _bfd_vms_output_begin_subrec (struct vms_rec_wr *, int);
extern void _bfd_vms_output_end_subrec (struct vms_rec_wr *);
extern void _bfd_vms_output_end (bfd *, struct vms_rec_wr *);
extern bool _bfd_vms_output_end (bfd *, struct vms_rec_wr *);
extern int _bfd_vms_output_check (struct vms_rec_wr *, int);
extern void _bfd_vms_output_byte (struct vms_rec_wr *, unsigned);
extern void _bfd_vms_output_short (struct vms_rec_wr *, unsigned);

View File

@ -548,8 +548,8 @@ wasm_compute_custom_section_file_position (bfd *abfd,
}
while (nl);
bfd_seek (abfd, fs->pos, SEEK_SET);
if (! wasm_write_uleb128 (abfd, 0)
if (bfd_seek (abfd, fs->pos, SEEK_SET) != 0
|| ! wasm_write_uleb128 (abfd, 0)
|| ! wasm_write_uleb128 (abfd, payload_len)
|| ! wasm_write_uleb128 (abfd, name_len)
|| bfd_write (name, name_len, abfd) != name_len)
@ -586,9 +586,8 @@ wasm_compute_section_file_positions (bfd *abfd)
struct compute_section_arg fs;
unsigned int i;
bfd_seek (abfd, (bfd_vma) 0, SEEK_SET);
if (bfd_write (magic, sizeof (magic), abfd) != (sizeof magic)
if (bfd_seek (abfd, (bfd_vma) 0, SEEK_SET) != 0
|| bfd_write (magic, sizeof (magic), abfd) != (sizeof magic)
|| bfd_write (vers, sizeof (vers), abfd) != sizeof (vers))
return false;

View File

@ -2207,8 +2207,8 @@ bfd_sym_scan (bfd *abfd, bfd_sym_version version, bfd_sym_data_struct *mdata)
mdata->sbfd = abfd;
mdata->version = version;
bfd_seek (abfd, 0, SEEK_SET);
if (bfd_sym_read_header (abfd, &mdata->header, mdata->version) != 0)
if (bfd_seek (abfd, 0, SEEK_SET) != 0
|| bfd_sym_read_header (abfd, &mdata->header, mdata->version) != 0)
return -1;
mdata->name_table = bfd_sym_read_name_table (abfd, &mdata->header);
@ -2236,8 +2236,8 @@ bfd_sym_object_p (bfd *abfd)
bfd_sym_version version = -1;
bfd_sym_data_struct *mdata;
bfd_seek (abfd, 0, SEEK_SET);
if (bfd_sym_read_version (abfd, &version) != 0)
if (bfd_seek (abfd, 0, SEEK_SET) != 0
|| bfd_sym_read_version (abfd, &version) != 0)
goto wrong;
mdata = (bfd_sym_data_struct *) bfd_alloc (abfd, sizeof (*mdata));

View File

@ -1078,7 +1078,8 @@ print_contents (bfd *abfd)
if (verbose)
printf ("\n<%s>\n\n", bfd_get_filename (abfd));
bfd_seek (abfd, 0, SEEK_SET);
if (bfd_seek (abfd, 0, SEEK_SET) != 0)
bfd_fatal (bfd_get_filename (abfd));
size = buf.st_size;
while (ncopied < size)
@ -1176,7 +1177,8 @@ extract_file (bfd *abfd)
fatal (_("internal stat error on %s"), bfd_get_filename (abfd));
size = buf.st_size;
bfd_seek (abfd, 0, SEEK_SET);
if (bfd_seek (abfd, 0, SEEK_SET) != 0)
bfd_fatal (bfd_get_filename (abfd));
output_file = NULL;
if (size == 0)

View File

@ -4185,10 +4185,9 @@ create_section_contrib_substream (bfd *abfd, void **data, uint32_t *size)
for (unsigned int i = 0; i < abfd->section_count; i++)
{
bfd_seek (abfd, offset, SEEK_SET);
if (bfd_read (sect_flags + (i * sizeof (uint32_t)), sizeof (uint32_t),
abfd) != sizeof (uint32_t))
if (bfd_seek (abfd, offset, SEEK_SET) != 0
|| bfd_read (sect_flags + (i * sizeof (uint32_t)), sizeof (uint32_t),
abfd) != sizeof (uint32_t))
{
free (*data);
free (sect_flags);
@ -4993,7 +4992,8 @@ create_section_header_stream (bfd *pdb, bfd *abfd, uint16_t *num)
scn_base = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
bfd_seek (abfd, scn_base, SEEK_SET);
if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
return false;
len = section_count * sizeof (struct external_scnhdr);
buf = xmalloc (len);

View File

@ -3419,22 +3419,30 @@ pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
handled, FALSE if not. */
static unsigned int
pe_get16 (bfd *abfd, int where)
pe_get16 (bfd *abfd, int where, bool *fail)
{
unsigned char b[2];
bfd_seek (abfd, where, SEEK_SET);
bfd_read (b, 2, abfd);
if (bfd_seek (abfd, where, SEEK_SET) != 0
|| bfd_read (b, 2, abfd) != 2)
{
*fail = true;
return 0;
}
return b[0] + (b[1] << 8);
}
static unsigned int
pe_get32 (bfd *abfd, int where)
pe_get32 (bfd *abfd, int where, bool *fail)
{
unsigned char b[4];
bfd_seek (abfd, where, SEEK_SET);
bfd_read (b, 4, abfd);
if (bfd_seek (abfd, where, SEEK_SET) != 0
|| bfd_read (b, 4, abfd) != 4)
{
*fail = true;
return 0;
}
return b[0] + (b[1] << 8) + (b[2] << 16) + ((unsigned) b[3] << 24);
}
@ -3481,38 +3489,49 @@ pe_implied_import_dll (const char *filename)
/* PEI dlls seem to be bfd_objects. */
if (!bfd_check_format (dll, bfd_object))
{
notdll:
einfo (_("%X%P: %s: this doesn't appear to be a DLL\n"), filename);
return false;
}
/* Get pe_header, optional header and numbers of directory entries. */
pe_header_offset = pe_get32 (dll, 0x3c);
bool fail = false;
pe_header_offset = pe_get32 (dll, 0x3c, &fail);
if (fail)
goto notdll;
opthdr_ofs = pe_header_offset + 4 + 20;
#ifdef pe_use_plus
num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
/* NumberOfRvaAndSizes. */
num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4, &fail);
#else
num_entries = pe_get32 (dll, opthdr_ofs + 92);
num_entries = pe_get32 (dll, opthdr_ofs + 92, &fail);
#endif
if (fail)
goto notdll;
/* No import or export directory entry. */
if (num_entries < 1)
return false;
#ifdef pe_use_plus
export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4, &fail);
export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4, &fail);
#else
export_rva = pe_get32 (dll, opthdr_ofs + 96);
export_size = pe_get32 (dll, opthdr_ofs + 100);
export_rva = pe_get32 (dll, opthdr_ofs + 96, &fail);
export_size = pe_get32 (dll, opthdr_ofs + 100, &fail);
#endif
if (fail)
goto notdll;
/* No export table - nothing to export. */
if (export_size == 0)
return false;
nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
nsections = pe_get16 (dll, pe_header_offset + 4 + 2, &fail);
secptr = (pe_header_offset + 4 + 20 +
pe_get16 (dll, pe_header_offset + 4 + 16));
pe_get16 (dll, pe_header_offset + 4 + 16, &fail));
if (fail)
goto notdll;
expptr = 0;
/* Get the rva and size of the export section. */
@ -3520,12 +3539,14 @@ pe_implied_import_dll (const char *filename)
{
char sname[8];
bfd_vma secptr1 = secptr + 40 * i;
bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
bfd_vma vsize = pe_get32 (dll, secptr1 + 16);
bfd_vma fptr = pe_get32 (dll, secptr1 + 20);
bfd_vma vaddr = pe_get32 (dll, secptr1 + 12, &fail);
bfd_vma vsize = pe_get32 (dll, secptr1 + 16, &fail);
bfd_vma fptr = pe_get32 (dll, secptr1 + 20, &fail);
bfd_seek (dll, secptr1, SEEK_SET);
bfd_read (sname, 8, dll);
if (fail
|| bfd_seek (dll, secptr1, SEEK_SET) != 0
|| bfd_read (sname, 8, dll) != 8)
goto notdll;
if (vaddr <= export_rva && vaddr + vsize > export_rva)
{
@ -3541,14 +3562,16 @@ pe_implied_import_dll (const char *filename)
for (i = 0; i < nsections; i++)
{
bfd_vma secptr1 = secptr + 40 * i;
bfd_vma vsize = pe_get32 (dll, secptr1 + 8);
bfd_vma vaddr = pe_get32 (dll, secptr1 + 12);
bfd_vma flags = pe_get32 (dll, secptr1 + 36);
bfd_vma vsize = pe_get32 (dll, secptr1 + 8, &fail);
bfd_vma vaddr = pe_get32 (dll, secptr1 + 12, &fail);
bfd_vma flags = pe_get32 (dll, secptr1 + 36, &fail);
char sec_name[9];
sec_name[8] = '\0';
bfd_seek (dll, secptr1 + 0, SEEK_SET);
bfd_read (sec_name, 8, dll);
if (fail
|| bfd_seek (dll, secptr1 + 0, SEEK_SET) != 0
|| bfd_read (sec_name, 8, dll) != 8)
goto notdll;
if (strcmp(sec_name,".data") == 0)
{
@ -3583,8 +3606,9 @@ pe_implied_import_dll (const char *filename)
}
expdata = xmalloc (export_size);
bfd_seek (dll, expptr, SEEK_SET);
bfd_read (expdata, export_size, dll);
if (bfd_seek (dll, expptr, SEEK_SET) != 0
|| bfd_read (expdata, export_size, dll) != export_size)
goto notdll;
erva = (char *) expdata - export_rva;
if (pe_def_file == 0)