]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
tdata related object_p tidy for various formats
authorAlan Modra <amodra@gmail.com>
Tue, 10 Dec 2024 05:32:53 +0000 (16:02 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 12 Dec 2024 05:34:51 +0000 (16:04 +1030)
The aout object_p function copies any existing tdata.  Apparently this
was done for hp300, an old target that is no longer supported.  See
commit ebd241352942.  This isn't useful for current sources, nor is it
necessary or useful any more to preserve tdata in object_p functions
when a target doesn't match.  When I was fixing this, I noticed some
object_p functions rudely didn't release memory on failures, and
others had nits in the bfd_error returns.

* aoutx.h (some_aout_object_p): Don't restore previous tdata
on failure.  Don't copy any existing tdata.
* archive.c (bfd_generic_archive_p): Don't restore previous
tdata on failure.
* pdp11.c (some_aout_object_p): Likewise.
* coff-rs6000.c (_bfd_xcoff_archive_p): Allocate both artdata
and extension in one call.  Don't restore previous tdata on
failure.
* coff64-rs6000.c (xcoff64_archive_p): Likewise.
* coffgen.c (coff_real_object_p): Don't restore previous
tdata on failure.
* ihex.c (ihex_object_p): Likewise.  Simplify release of tdata
on scan failure.
* mach-o.c (bfd_mach_o_scan): Don't set tdata here.  Do set
error on read_command failure.
(bfd_mach_o_header_p): Set tdata here, release on failure.
Tidy bfd_error return values.
(bfd_mach_o_fat_archive_p): Tidy error return values.
* mmo.c (mmo_mkobject): Do not test current tdata.
* pef.c (bfd_pef_scan_start_address): Set bfd_error on
failure.
(bfd_pef_scan): Don't set tdata here.
(bfd_pef_object_p): Set tdata here, release on failure.  Tidy
bfd_error return values.
(bfd_pef_xlib_object_p): Tidy bfd_error return values.
* srec.c (srec_object_p): Don't restore previous tdata on
failure.  Do release tdata on failure.
(symbolsrec_object_p): Likewise.
* tekhex.c (tekhex_object_p): Don't ignore tekhex_mkobject
failure.  Release tdata on failure.
* vms-alpha.c (alpha_vms_object_p): Don't restore previous
tdata on failure.  Simplify release of tdata.
* xsym.c (bfd_sym_scan): Don't set tdata here.
(bfd_sym_object_p): Set tdata here.  Release on failure.

14 files changed:
bfd/aoutx.h
bfd/archive.c
bfd/coff-rs6000.c
bfd/coff64-rs6000.c
bfd/coffgen.c
bfd/ihex.c
bfd/mach-o.c
bfd/mmo.c
bfd/pdp11.c
bfd/pef.c
bfd/srec.c
bfd/tekhex.c
bfd/vms-alpha.c
bfd/xsym.c

index 4c5be61b72281f897f009323583f0452dcc32d97..13a5d82f8ebd85d88c5c7971cbb637926dd8a792 100644 (file)
@@ -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;
 }
 
index ad7673971a31943df084b6b82d4aee55cc1eb835..12efa9d6ee3bb8c9118044643b1806a51ba5dd67 100644 (file)
@@ -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;
     }
 
index 09d868bcf826a8a5d49106fccf21e4df11bc59c5..fff610dd4c5950ef858d3b403fbc237cbcb79c84 100644 (file)
@@ -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;
     }
 
index 850a63c18b4430f48f883851e8470e8e1f901a1e..2c3576aceb0dc15f5237eda6497e4b2e60877035 100644 (file)
@@ -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;
     }
 
index 5754dbbae15474cc53a80954e5f39541da5df0c3..dc5b0f4002030d6a43903a82b4f120f80fc43548 100644 (file)
@@ -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;
index 41eeb2334725711ace1f3e3d37f7493bc9c10412..1dd1b2bf169aa538751385b90454761341d0b1e8 100644 (file)
@@ -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;
     }
 
index 037718fb22cffc18e095b68353306ff9ee39ab03..49ecd13f736235b81d5810a502c584a5a94ec7fc 100644 (file)
@@ -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;
 }
 
index 8018fc7bfb486a75b20b3fd83665b178d36be4ce..6704bc27d6b4f9ed29c8f8a94577fd7464937a25 100644 (file)
--- a/bfd/mmo.c
+++ b/bfd/mmo.c
@@ -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;
 }
index ef86400e842f507bc8addfb64859474b5ff17b72..7099c0b15dda30f235f53ff051ec69b6042d3265 100644 (file)
@@ -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;
 }
 
index 2d2f5597a6677d4a22d3bb55025727df0978b6b9..a82db909374c880e21db27ab0854075949ffc719 100644 (file)
--- a/bfd/pef.c
+++ b/bfd/pef.c
@@ -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;
 }
index 1534c81ca599ac40e9efe432965b3f2e40da744f..565ce0a868c4e86436288bcd969ac989cbde94fc 100644 (file)
@@ -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;
     }
 
index b305c1f96f14df2edc497d400abb52a3234ed814..00976b5f5f19c23ba8c3d02e1e5f6e658aecf330 100644 (file)
@@ -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;
 }
index df279bc4f68d06979c0218d08bafcca32bfcfad3..092798a51a26b751c2dec08071bef04a7bcafb60 100644 (file)
@@ -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;
 }
 \f
index fe14acc121fbff91340db3f22550ef999449c1bc..c0d4e445c4f1544f161e52ee9a2edfbffb6f0178 100644 (file)
@@ -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;
 }