From 90d92a632aaf75ce698335efeb383ddf785c12d8 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 18 Sep 2019 10:34:46 +0930 Subject: Use bfd_set_filename more 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/vms-lib.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) (limited to 'bfd/vms-lib.c') diff --git a/bfd/vms-lib.c b/bfd/vms-lib.c index f238ba0..43addd4 100644 --- a/bfd/vms-lib.c +++ b/bfd/vms-lib.c @@ -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; -- cgit v1.1