]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Use bfd_set_filename more
authorAlan Modra <amodra@gmail.com>
Wed, 18 Sep 2019 01:04:46 +0000 (10:34 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 18 Sep 2019 12:02:51 +0000 (21:32 +0930)
Fixes a few leaks in bfd and ld.

bfd/
* mach-o.c (bfd_mach_o_fat_member_init): Likewise.  Replace
xstrdup and xmalloc with bfd_strdup and bfd_malloc.  Return an
error status.  Adjust calls.
* vms-lib.c (_bfd_vms_lib_get_module): Test mhd->id earlier.
Close bfd on failure.  Replace xstrdup/bfd_alloc use with
bfd_malloc.  Use bfd_set_filename.
gdb/
* solib-spu.c (spu_bfd_open): Use bfd_set_filename.
* spu-linux-nat.c (spu_bfd_open): Likewise.
ld/
* emultempl/pe.em (after_open): Use bfd_set_filename.
* emultempl/pep.em (after_open): Use bfd_set_filename.

bfd/ChangeLog
bfd/mach-o.c
bfd/vms-lib.c
gdb/ChangeLog
gdb/solib-spu.c
gdb/spu-linux-nat.c
ld/ChangeLog
ld/emultempl/pe.em
ld/emultempl/pep.em

index 4f48818ef3ea3ded529d38bfad6de501ee9f2b56..08605c3a80a8984e6b6dfbdbc32a0067eefb5bbb 100644 (file)
@@ -1,3 +1,12 @@
+2019-09-18  Alan Modra  <amodra@gmail.com>
+
+       * mach-o.c (bfd_mach_o_fat_member_init): Likewise.  Replace
+       xstrdup and xmalloc with bfd_strdup and bfd_malloc.  Return an
+       error status.  Adjust calls.
+       * vms-lib.c (_bfd_vms_lib_get_module): Test mhd->id earlier.
+       Close bfd on failure.  Replace xstrdup/bfd_alloc use with
+       bfd_malloc.  Use bfd_set_filename.
+
 2019-09-18  Alan Modra  <amodra@gmail.com>
 
        * elf64-ppc.c (must_be_dyn_reloc): Return 0 for TOC16 relocs.
index d02398048cebba6c1f70e64289981a3f0a885b12..7d70087c95e151ac8c3ceb8fe0754251d69de5aa 100644 (file)
@@ -5417,7 +5417,7 @@ bfd_mach_o_fat_archive_p (bfd *abfd)
    ARCH_TYPE/ARCH_SUBTYPE and corresponding entry in header is ENTRY.
    Set arelt_data and origin fields too.  */
 
-static void
+static bfd_boolean
 bfd_mach_o_fat_member_init (bfd *abfd,
                            enum bfd_architecture arch_type,
                            unsigned long arch_subtype,
@@ -5426,27 +5426,35 @@ bfd_mach_o_fat_member_init (bfd *abfd,
   struct areltdata *areltdata;
   /* Create the member filename. Use ARCH_NAME.  */
   const bfd_arch_info_type *ap = bfd_lookup_arch (arch_type, arch_subtype);
+  char *filename;
 
   if (ap)
     {
       /* Use the architecture name if known.  */
-      abfd->filename = xstrdup (ap->printable_name);
+      filename = bfd_strdup (ap->printable_name);
+      if (filename == NULL)
+       return FALSE;
     }
   else
     {
       /* Forge a uniq id.  */
       const size_t namelen = 2 + 8 + 1 + 2 + 8 + 1;
-      char *name = xmalloc (namelen);
-      snprintf (name, namelen, "0x%lx-0x%lx",
+      filename = bfd_malloc (namelen);
+      if (filename == NULL)
+       return FALSE;
+      snprintf (filename, namelen, "0x%lx-0x%lx",
                entry->cputype, entry->cpusubtype);
-      abfd->filename = name;
     }
+  bfd_set_filename (abfd, filename);
 
   areltdata = bfd_zmalloc (sizeof (struct areltdata));
+  if (areltdata == NULL)
+    return FALSE;
   areltdata->parsed_size = entry->size;
   abfd->arelt_data = areltdata;
   abfd->iostream = NULL;
   abfd->origin = entry->offset;
+  return TRUE;
 }
 
 bfd *
@@ -5502,7 +5510,11 @@ bfd_mach_o_fat_openr_next_archived_file (bfd *archive, bfd *prev)
   bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
                                   &arch_type, &arch_subtype);
 
-  bfd_mach_o_fat_member_init (nbfd, arch_type, arch_subtype, entry);
+  if (!bfd_mach_o_fat_member_init (nbfd, arch_type, arch_subtype, entry))
+    {
+      bfd_close (nbfd);
+      return NULL;
+    }
 
   bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
 
@@ -5574,9 +5586,8 @@ bfd_mach_o_fat_extract (bfd *abfd,
       if (res == NULL)
        return NULL;
 
-      bfd_mach_o_fat_member_init (res, cpu_type, cpu_subtype, e);
-
-      if (bfd_check_format (res, format))
+      if (bfd_mach_o_fat_member_init (res, cpu_type, cpu_subtype, e)
+         && bfd_check_format (res, format))
        {
          BFD_ASSERT (bfd_get_arch_info (res) == arch);
          return res;
index f238ba0016ed62ca24f42fbbbd8070fc5aac9dae..43addd46ecf9c6a38dd58f1cf46de235e4b77d3a 100644 (file)
@@ -1297,7 +1297,9 @@ _bfd_vms_lib_get_module (bfd *abfd, unsigned int modidx)
   struct lib_tdata *tdata = bfd_libdata (abfd);
   bfd *res;
   file_ptr file_off;
-  char *name;
+  const char *name;
+  char *newname;
+  size_t namelen;
 
   /* Sanity check.  */
   if (modidx >= tdata->nbr_modules)
@@ -1335,18 +1337,22 @@ _bfd_vms_lib_get_module (bfd *abfd, unsigned int modidx)
       if (bfd_bread (buf, tdata->mhd_size, abfd) != tdata->mhd_size)
        return NULL;
 
+      mhd = (struct vms_mhd *) buf;
+      if (mhd->id != MHD__C_MHDID)
+       return NULL;
+
       res = _bfd_create_empty_archive_element_shell (abfd);
       if (res == NULL)
        return NULL;
       arelt = bfd_zmalloc (sizeof (*arelt));
       if (arelt == NULL)
-       return NULL;
+       {
+         bfd_close (res);
+         return NULL;
+       }
       res->arelt_data = arelt;
 
       /* Get info from mhd.  */
-      mhd = (struct vms_mhd *)buf;
-      if (mhd->id != MHD__C_MHDID)
-       return NULL;
       if (tdata->mhd_size >= offsetof (struct vms_mhd, objstat) + 1)
        res->selective_search = (mhd->objstat & MHD__M_SELSRC) ? 1 : 0;
       res->mtime = vms_rawtime_to_time_t (mhd->datim);
@@ -1361,23 +1367,25 @@ _bfd_vms_lib_get_module (bfd *abfd, unsigned int modidx)
 
   /* Set filename.  */
   name = tdata->modules[modidx].name;
+  namelen = strlen (name);
+  newname = bfd_malloc (namelen + 4 + 1);
+  if (newname == NULL)
+    {
+      bfd_close (res);
+      return NULL;
+    }
+  strcpy (newname, name);
   switch (tdata->type)
     {
     case LBR__C_TYP_IOBJ:
     case LBR__C_TYP_EOBJ:
       /* For object archives, append .obj to mimic standard behaviour.  */
-      {
-       size_t namelen = strlen (name);
-       char *name1 = bfd_alloc (res, namelen + 4 + 1);
-       memcpy (name1, name, namelen);
-       strcpy (name1 + namelen, ".obj");
-       name = name1;
-      }
+      strcpy (newname + namelen, ".obj");
       break;
     default:
       break;
     }
-  res->filename = xstrdup (name);
+  bfd_set_filename (res, newname);
 
   tdata->cache[modidx] = res;
 
index 39fcac7a04ea9743a612b39c95e5a11c50705010..9ad5000480c20be322b5122c0289d7dcd4087acd 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-18  Alan Modra  <amodra@gmail.com>
+
+       * solib-spu.c (spu_bfd_open): Use bfd_set_filename.
+       * spu-linux-nat.c (spu_bfd_open): Likewise.
+
 2019-09-18  Christian Biesinger  <cbiesinger@google.com>
 
        * dwarf2loc.c: Change extern declaration of dwarf_always_disassemble
index 5b97b9bcf68885c0cc78f2548eb51217121810bf..c5e0acaf02ac23bb50d74ba6576ec3b6248b07b2 100644 (file)
@@ -377,8 +377,7 @@ spu_bfd_open (const char *pathname)
 
          strcat (buf, original_name);
 
-         xfree ((char *)abfd->filename);
-         abfd->filename = xstrdup (buf);
+         bfd_set_filename (abfd.get (), xstrdup (buf));
        }
     }
 
index 2f4b4d694642b2a4576f3c5f101489af6d906814..9dbb6337344fda981c8c9b372f3e65eab68904f2 100644 (file)
@@ -371,8 +371,7 @@ spu_bfd_open (ULONGEST addr)
                                    sect_size - 20);
          buf[sect_size - 20] = '\0';
 
-         xfree ((char *)nbfd->filename);
-         nbfd->filename = xstrdup (buf);
+         bfd_set_filename (nbfd.get (), xstrdup (buf));
        }
     }
 
index ea28a0b56fb2089cdace80773b56371c840a6fe1..81935a408c582226d4bd7da57914ba249c619402 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-18  Alan Modra  <amodra@gmail.com>
+
+       * emultempl/pe.em (after_open): Use bfd_set_filename.
+       * emultempl/pep.em (after_open): Use bfd_set_filename.
+
 2019-09-16  Alan Modra  <amodra@gmail.com>
 
        PR 25002
index 49bb66b906a70dd916ca374830195d1946e0f642..2e78f26ad8b1c4e19642bc5fb69d52ba2e81b938 100644 (file)
@@ -1543,7 +1543,7 @@ gld_${EMULATION_NAME}_after_open (void)
                        /* Rename this implib to match the other one.  */
                        n = xmalloc (strlen (other_bfd_filename) + 1);
                        strcpy (n, other_bfd_filename);
-                       is->the_bfd->my_archive->filename = n;
+                       bfd_set_filename (is->the_bfd->my_archive, n);
                      }
 
                    free (relocs);
@@ -1648,7 +1648,7 @@ gld_${EMULATION_NAME}_after_open (void)
 
                new_name = xmalloc (strlen (is->the_bfd->filename) + 3);
                sprintf (new_name, "%s.%c", is->the_bfd->filename, seq);
-               is->the_bfd->filename = new_name;
+               bfd_set_filename (is->the_bfd, new_name);
 
                new_name = xmalloc (strlen (is->filename) + 3);
                sprintf (new_name, "%s.%c", is->filename, seq);
index 4daa32b5c618b2cf4db9666f4a23ff526c5cb10e..601ef11c2014aaec8bfd7d864f69a78344e00358 100644 (file)
@@ -1510,7 +1510,7 @@ gld_${EMULATION_NAME}_after_open (void)
                        /* Rename this implib to match the other one.  */
                        n = xmalloc (strlen (other_bfd_filename) + 1);
                        strcpy (n, other_bfd_filename);
-                       is->the_bfd->my_archive->filename = n;
+                       bfd_set_filename (is->the_bfd->my_archive, n);
                      }
 
                    free (relocs);
@@ -1615,7 +1615,7 @@ gld_${EMULATION_NAME}_after_open (void)
 
                new_name = xmalloc (strlen (is->the_bfd->filename) + 3);
                sprintf (new_name, "%s.%c", is->the_bfd->filename, seq);
-               is->the_bfd->filename = new_name;
+               bfd_set_filename (is->the_bfd, new_name);
 
                new_name = xmalloc (strlen (is->filename) + 3);
                sprintf (new_name, "%s.%c", is->filename, seq);