@@ -496,21 +496,14 @@ NAME (aout, some_aout_object_p) (bfd *abfd,
struct internal_exec *execp,
bfd_cleanup (*callback_to_real_object_p) (bfd *))
{
- struct aout_data_struct *rawptr, *oldrawptr;
+ struct aout_data_struct *rawptr;
bfd_cleanup result;
- size_t amt = sizeof (*rawptr);
- rawptr = bfd_zalloc (abfd, amt);
+ rawptr = bfd_zalloc (abfd, sizeof (*rawptr));
if (rawptr == NULL)
return NULL;
-
- oldrawptr = abfd->tdata.aout_data;
abfd->tdata.aout_data = rawptr;
- /* Copy the contents of the old tdata struct. */
- if (oldrawptr != NULL)
- *abfd->tdata.aout_data = *oldrawptr;
-
abfd->tdata.aout_data->a.hdr = &rawptr->e;
/* Copy in the internal_exec struct. */
*(abfd->tdata.aout_data->a.hdr) = *execp;
@@ -675,7 +668,6 @@ NAME (aout, some_aout_object_p) (bfd *abfd,
error_ret:
bfd_release (abfd, rawptr);
- abfd->tdata.aout_data = oldrawptr;
return NULL;
}
@@ -894,7 +894,6 @@ _bfd_noarchive_openr_next_archived_file (bfd *archive,
bfd_cleanup
bfd_generic_archive_p (bfd *abfd)
{
- struct artdata *tdata_hold;
char armag[SARMAG + 1];
size_t amt;
@@ -914,15 +913,10 @@ bfd_generic_archive_p (bfd *abfd)
return NULL;
}
- tdata_hold = bfd_ardata (abfd);
-
amt = sizeof (struct artdata);
bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
if (bfd_ardata (abfd) == NULL)
- {
- bfd_ardata (abfd) = tdata_hold;
- return NULL;
- }
+ return NULL;
bfd_ardata (abfd)->first_file_filepos = SARMAG;
@@ -932,7 +926,6 @@ bfd_generic_archive_p (bfd *abfd)
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
bfd_release (abfd, bfd_ardata (abfd));
- bfd_ardata (abfd) = tdata_hold;
return NULL;
}
@@ -1500,7 +1500,6 @@ _bfd_xcoff_slurp_armap (bfd *abfd)
bfd_cleanup
_bfd_xcoff_archive_p (bfd *abfd)
{
- struct artdata *tdata_hold;
char magic[SXCOFFARMAG];
size_t amt = SXCOFFARMAG;
@@ -1518,12 +1517,12 @@ _bfd_xcoff_archive_p (bfd *abfd)
return NULL;
}
- tdata_hold = bfd_ardata (abfd);
+ amt = sizeof (struct artdata) + sizeof (struct xcoff_artdata);
+ bfd_ardata (abfd) = bfd_zalloc (abfd, amt);
+ if (bfd_ardata (abfd) == NULL)
+ return NULL;
- amt = sizeof (struct artdata);
- bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
- if (bfd_ardata (abfd) == (struct artdata *) NULL)
- goto error_ret_restore;
+ bfd_ardata (abfd)->tdata = (void *) ((struct artdata *) bfd_ardata (abfd) + 1);
/* Now handle the two formats. */
if (magic[1] != 'b')
@@ -1546,11 +1545,6 @@ _bfd_xcoff_archive_p (bfd *abfd)
GET_VALUE_IN_FIELD (bfd_ardata (abfd)->first_file_filepos,
hdr.firstmemoff, 10);
- amt = sizeof (struct xcoff_artdata);
- bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
- if (bfd_ardata (abfd)->tdata == NULL)
- goto error_ret;
-
memcpy (&x_artdata (abfd)->u.hdr, &hdr, SIZEOF_AR_FILE_HDR);
}
else
@@ -1574,11 +1568,6 @@ _bfd_xcoff_archive_p (bfd *abfd)
(const char **) 0,
10);
- amt = sizeof (struct xcoff_artdata);
- bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
- if (bfd_ardata (abfd)->tdata == NULL)
- goto error_ret;
-
memcpy (&x_artdata (abfd)->u.bhdr, &hdr, SIZEOF_AR_FILE_HDR_BIG);
}
@@ -1586,8 +1575,6 @@ _bfd_xcoff_archive_p (bfd *abfd)
{
error_ret:
bfd_release (abfd, bfd_ardata (abfd));
- error_ret_restore:
- bfd_ardata (abfd) = tdata_hold;
return NULL;
}
@@ -1900,7 +1900,6 @@ xcoff64_slurp_armap (bfd *abfd)
static bfd_cleanup
xcoff64_archive_p (bfd *abfd)
{
- struct artdata *tdata_hold;
char magic[SXCOFFARMAG];
/* This is the new format. */
struct xcoff_ar_file_hdr_big hdr;
@@ -1931,30 +1930,22 @@ xcoff64_archive_p (bfd *abfd)
return NULL;
}
- tdata_hold = bfd_ardata (abfd);
+ amt = sizeof (struct artdata) + sizeof (struct xcoff_artdata);
+ bfd_ardata (abfd) = bfd_zalloc (abfd, amt);
+ if (bfd_ardata (abfd) == NULL)
+ return NULL;
- amt = sizeof (struct artdata);
- bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
- if (bfd_ardata (abfd) == (struct artdata *) NULL)
- goto error_ret_restore;
+ bfd_ardata (abfd)->tdata = (void *) ((struct artdata *) bfd_ardata (abfd) + 1);
bfd_ardata (abfd)->first_file_filepos = bfd_scan_vma (hdr.firstmemoff,
(const char **) NULL,
10);
- amt = sizeof (struct xcoff_artdata);
- bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
- if (bfd_ardata (abfd)->tdata == NULL)
- goto error_ret;
-
memcpy (&x_artdata (abfd)->u.bhdr, &hdr, SIZEOF_AR_FILE_HDR_BIG);
if (! xcoff64_slurp_armap (abfd))
{
- error_ret:
bfd_release (abfd, bfd_ardata (abfd));
- error_ret_restore:
- bfd_ardata (abfd) = tdata_hold;
return NULL;
}
@@ -307,7 +307,6 @@ coff_real_object_p (bfd *abfd,
flagword oflags = abfd->flags;
bfd_vma ostart = bfd_get_start_address (abfd);
void * tdata;
- void * tdata_save;
bfd_size_type readsize; /* Length of file_info. */
unsigned int scnhsz;
char *external_sections;
@@ -336,7 +335,6 @@ coff_real_object_p (bfd *abfd,
/* Set up the tdata area. ECOFF uses its own routine, and overrides
abfd->flags. */
- tdata_save = abfd->tdata.any;
tdata = bfd_coff_mkobject_hook (abfd, (void *) internal_f, (void *) internal_a);
if (tdata == NULL)
goto fail2;
@@ -375,7 +373,6 @@ coff_real_object_p (bfd *abfd,
_bfd_coff_free_symbols (abfd);
bfd_release (abfd, tdata);
fail2:
- abfd->tdata.any = tdata_save;
abfd->flags = oflags;
abfd->start_address = ostart;
return NULL;
@@ -486,7 +486,6 @@ ihex_scan (bfd *abfd)
static bfd_cleanup
ihex_object_p (bfd *abfd)
{
- void * tdata_save;
bfd_byte b[9];
unsigned int i;
unsigned int type;
@@ -525,12 +524,12 @@ ihex_object_p (bfd *abfd)
}
/* OK, it looks like it really is an Intel Hex file. */
- tdata_save = abfd->tdata.any;
- if (! ihex_mkobject (abfd) || ! ihex_scan (abfd))
+ if (!ihex_mkobject (abfd))
+ return NULL;
+
+ if (!ihex_scan (abfd))
{
- if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
- bfd_release (abfd, abfd->tdata.any);
- abfd->tdata.any = tdata_save;
+ bfd_release (abfd, abfd->tdata.any);
return NULL;
}
@@ -5263,8 +5263,6 @@ bfd_mach_o_scan (bfd *abfd,
break;
}
- abfd->tdata.mach_o_data = mdata;
-
bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
&cpu_type, &cpu_subtype);
if (cpu_type == bfd_arch_unknown)
@@ -5320,7 +5318,10 @@ bfd_mach_o_scan (bfd *abfd,
}
if (!bfd_mach_o_read_command (abfd, cur, filesize))
- return false;
+ {
+ bfd_set_error (bfd_error_wrong_format);
+ return false;
+ }
}
}
@@ -5443,18 +5444,21 @@ bfd_mach_o_header_p (bfd *abfd,
mdata = (bfd_mach_o_data_struct *) bfd_zalloc (abfd, sizeof (*mdata));
if (mdata == NULL)
- goto fail;
+ return NULL;
+ abfd->tdata.mach_o_data = mdata;
+
mdata->hdr_offset = hdr_off;
if (!bfd_mach_o_scan (abfd, &header, mdata))
- goto wrong;
+ {
+ bfd_release (abfd, mdata);
+ return NULL;
+ }
return _bfd_no_cleanup;
wrong:
bfd_set_error (bfd_error_wrong_format);
-
- fail:
return NULL;
}
@@ -5541,7 +5545,11 @@ bfd_mach_o_fat_archive_p (bfd *abfd)
if (bfd_seek (abfd, 0, SEEK_SET) != 0
|| bfd_read (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
- goto error;
+ {
+ if (bfd_get_error () != bfd_error_system_call)
+ goto wrong;
+ goto error;
+ }
adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
if (adata == NULL)
@@ -5550,12 +5558,12 @@ bfd_mach_o_fat_archive_p (bfd *abfd)
adata->magic = bfd_getb32 (hdr.magic);
adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
if (adata->magic != 0xcafebabe)
- goto error;
+ goto wrong;
/* Avoid matching Java bytecode files, which have the same magic number.
In the Java bytecode file format this field contains the JVM version,
which starts at 43.0. */
if (adata->nfat_arch > 30)
- goto error;
+ goto wrong;
if (_bfd_mul_overflow (adata->nfat_arch,
sizeof (mach_o_fat_archentry), &amt))
@@ -5596,10 +5604,11 @@ bfd_mach_o_fat_archive_p (bfd *abfd)
return _bfd_no_cleanup;
+ wrong:
+ bfd_set_error (bfd_error_wrong_format);
error:
if (adata != NULL)
bfd_release (abfd, adata);
- bfd_set_error (bfd_error_wrong_format);
return NULL;
}
@@ -565,21 +565,16 @@ mmo_mkobject (bfd *abfd)
{
mmo_init ();
- if (abfd->tdata.mmo_data == NULL)
- {
- time_t created;
-
- /* All fields are zero-initialized, so we don't have to explicitly
- initialize most. */
- tdata_type *tdata = (tdata_type *) bfd_zalloc (abfd, sizeof (tdata_type));
- if (tdata == NULL)
- return false;
+ /* All fields are zero-initialized, so we don't have to explicitly
+ initialize most. */
+ tdata_type *tdata = bfd_zalloc (abfd, sizeof (tdata_type));
+ if (tdata == NULL)
+ return false;
- created = time (NULL);
- bfd_put_32 (abfd, created, tdata->created);
+ time_t created = time (NULL);
+ bfd_put_32 (abfd, created, tdata->created);
- abfd->tdata.mmo_data = tdata;
- }
+ abfd->tdata.mmo_data = tdata;
return true;
}
@@ -533,21 +533,15 @@ NAME (aout, some_aout_object_p) (bfd *abfd,
struct internal_exec *execp,
bfd_cleanup (*callback_to_real_object_p) (bfd *))
{
- struct aout_data_struct *rawptr, *oldrawptr;
+ struct aout_data_struct *rawptr;
bfd_cleanup result;
size_t amt = sizeof (*rawptr);
rawptr = bfd_zalloc (abfd, amt);
if (rawptr == NULL)
return NULL;
-
- oldrawptr = abfd->tdata.aout_data;
abfd->tdata.aout_data = rawptr;
- /* Copy the contents of the old tdata struct. */
- if (oldrawptr != NULL)
- *abfd->tdata.aout_data = *oldrawptr;
-
abfd->tdata.aout_data->a.hdr = &rawptr->e;
/* Copy in the internal_exec struct. */
*(abfd->tdata.aout_data->a.hdr) = *execp;
@@ -710,7 +704,6 @@ NAME (aout, some_aout_object_p) (bfd *abfd,
error_ret:
bfd_release (abfd, rawptr);
- abfd->tdata.aout_data = oldrawptr;
return NULL;
}
@@ -483,7 +483,7 @@ bfd_pef_scan_start_address (bfd *abfd)
loaderlen = loadersec->size;
if (loaderlen < 56)
- goto error;
+ goto wrong;
if (bfd_seek (abfd, loadersec->filepos, SEEK_SET) != 0)
goto error;
loaderbuf = _bfd_malloc_and_read (abfd, loaderlen, loaderlen);
@@ -492,7 +492,7 @@ bfd_pef_scan_start_address (bfd *abfd)
ret = bfd_pef_parse_loader_header (abfd, loaderbuf, 56, &header);
if (ret < 0)
- goto error;
+ goto wrong;
if (header.main_section < 0)
goto end;
@@ -502,7 +502,7 @@ bfd_pef_scan_start_address (bfd *abfd)
break;
if (section == NULL)
- goto error;
+ goto wrong;
abfd->start_address = section->vma + header.main_offset;
@@ -510,6 +510,8 @@ bfd_pef_scan_start_address (bfd *abfd)
free (loaderbuf);
return 0;
+ wrong:
+ bfd_set_error (bfd_error_wrong_format);
error:
free (loaderbuf);
return -1;
@@ -559,8 +561,6 @@ bfd_pef_scan (bfd *abfd,
if (bfd_pef_scan_start_address (abfd) < 0)
return -1;
- abfd->tdata.pef_data = mdata;
-
return 0;
}
@@ -595,25 +595,26 @@ bfd_pef_object_p (bfd *abfd)
bfd_pef_data_struct *mdata;
if (bfd_pef_read_header (abfd, &header) != 0)
- goto wrong;
+ return NULL;
if (header.tag1 != BFD_PEF_TAG1 || header.tag2 != BFD_PEF_TAG2)
- goto wrong;
+ {
+ bfd_set_error (bfd_error_wrong_format);
+ return NULL;
+ }
mdata = (bfd_pef_data_struct *) bfd_zalloc (abfd, sizeof (*mdata));
if (mdata == NULL)
- goto fail;
+ return NULL;
if (bfd_pef_scan (abfd, &header, mdata))
- goto wrong;
+ {
+ bfd_release (abfd, mdata);
+ return NULL;
+ }
+ abfd->tdata.pef_data = mdata;
return _bfd_no_cleanup;
-
- wrong:
- bfd_set_error (bfd_error_wrong_format);
-
- fail:
- return NULL;
}
static int
@@ -1123,25 +1124,18 @@ bfd_pef_xlib_object_p (bfd *abfd)
{
bfd_pef_xlib_header header;
- if (bfd_pef_xlib_read_header (abfd, &header) != 0)
+ if (bfd_pef_xlib_read_header (abfd, &header) != 0
+ || header.tag1 != BFD_PEF_XLIB_TAG1
+ || (header.tag2 != BFD_PEF_VLIB_TAG2
+ && header.tag2 != BFD_PEF_BLIB_TAG2))
{
- bfd_set_error (bfd_error_wrong_format);
- return NULL;
- }
-
- if ((header.tag1 != BFD_PEF_XLIB_TAG1)
- || ((header.tag2 != BFD_PEF_VLIB_TAG2)
- && (header.tag2 != BFD_PEF_BLIB_TAG2)))
- {
- bfd_set_error (bfd_error_wrong_format);
+ if (bfd_get_error () != bfd_error_system_call)
+ bfd_set_error (bfd_error_wrong_format);
return NULL;
}
if (bfd_pef_xlib_scan (abfd, &header) != 0)
- {
- bfd_set_error (bfd_error_wrong_format);
- return NULL;
- }
+ return NULL;
return _bfd_no_cleanup;
}
@@ -642,7 +642,6 @@ srec_scan (bfd *abfd)
static bfd_cleanup
srec_object_p (bfd *abfd)
{
- void * tdata_save;
bfd_byte b[4];
srec_init ();
@@ -657,12 +656,12 @@ srec_object_p (bfd *abfd)
return NULL;
}
- tdata_save = abfd->tdata.any;
- if (! srec_mkobject (abfd) || ! srec_scan (abfd))
+ if (!srec_mkobject (abfd))
+ return NULL;
+
+ if (!srec_scan (abfd))
{
- if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
- bfd_release (abfd, abfd->tdata.any);
- abfd->tdata.any = tdata_save;
+ bfd_release (abfd, abfd->tdata.any);
return NULL;
}
@@ -677,7 +676,6 @@ srec_object_p (bfd *abfd)
static bfd_cleanup
symbolsrec_object_p (bfd *abfd)
{
- void * tdata_save;
char b[2];
srec_init ();
@@ -692,12 +690,12 @@ symbolsrec_object_p (bfd *abfd)
return NULL;
}
- tdata_save = abfd->tdata.any;
- if (! srec_mkobject (abfd) || ! srec_scan (abfd))
+ if (!srec_mkobject (abfd))
+ return NULL;
+
+ if (!srec_scan (abfd))
{
- if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
- bfd_release (abfd, abfd->tdata.any);
- abfd->tdata.any = tdata_save;
+ bfd_release (abfd, abfd->tdata.any);
return NULL;
}
@@ -616,10 +616,14 @@ tekhex_object_p (bfd *abfd)
if (b[0] != '%' || !ISHEX (b[1]) || !ISHEX (b[2]) || !ISHEX (b[3]))
return NULL;
- tekhex_mkobject (abfd);
+ if (!tekhex_mkobject (abfd))
+ return NULL;
if (!pass_over (abfd, first_phase))
- return NULL;
+ {
+ bfd_release (abfd, abfd->tdata.tekhex_data);
+ return NULL;
+ }
return _bfd_no_cleanup;
}
@@ -2790,7 +2790,6 @@ alpha_vms_free_private (bfd *abfd)
static bfd_cleanup
alpha_vms_object_p (bfd *abfd)
{
- void *tdata_save = abfd->tdata.any;
unsigned int test_len;
unsigned char *buf;
@@ -2798,10 +2797,7 @@ alpha_vms_object_p (bfd *abfd)
/* Allocate alpha-vms specific data. */
if (!vms_initialize (abfd))
- {
- abfd->tdata.any = tdata_save;
- return NULL;
- }
+ return NULL;
if (bfd_seek (abfd, 0, SEEK_SET))
goto error_ret;
@@ -2913,9 +2909,7 @@ alpha_vms_object_p (bfd *abfd)
error_ret:
alpha_vms_free_private (abfd);
- if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
- bfd_release (abfd, abfd->tdata.any);
- abfd->tdata.any = tdata_save;
+ bfd_release (abfd, abfd->tdata.any);
return NULL;
}
@@ -2224,8 +2224,6 @@ bfd_sym_scan (bfd *abfd, bfd_sym_version version, bfd_sym_data_struct *mdata)
bfdsec->filepos = 0;
bfdsec->alignment_power = 0;
- abfd->tdata.sym_data = mdata;
-
return 0;
}
@@ -2233,7 +2231,7 @@ bfd_cleanup
bfd_sym_object_p (bfd *abfd)
{
bfd_sym_version version = -1;
- bfd_sym_data_struct *mdata;
+ bfd_sym_data_struct *mdata = NULL;
if (bfd_seek (abfd, 0, SEEK_SET) != 0
|| bfd_sym_read_version (abfd, &version) != 0)
@@ -2246,12 +2244,15 @@ bfd_sym_object_p (bfd *abfd)
if (bfd_sym_scan (abfd, version, mdata) != 0)
goto wrong;
+ abfd->tdata.sym_data = mdata;
return _bfd_no_cleanup;
wrong:
bfd_set_error (bfd_error_wrong_format);
fail:
+ if (mdata)
+ bfd_release (abfd, mdata);
return NULL;
}