If the entry is indirect, recurse. */
static bfd_boolean
-vms_traverse_index (bfd *abfd, unsigned int vbn, struct carsym_mem *cs)
+vms_traverse_index (bfd *abfd, unsigned int vbn, struct carsym_mem *cs,
+ unsigned int recur_count)
{
struct vms_indexdef indexdef;
file_ptr off;
unsigned char *endp;
unsigned int n;
+ if (recur_count == 100)
+ {
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+
/* Read the index block. */
BFD_ASSERT (sizeof (indexdef) == VMS_BLOCK_SIZE);
if (!vms_read_block (abfd, vbn, &indexdef))
if (idx_off == RFADEF__C_INDEX)
{
/* Indirect entry. Recurse. */
- if (!vms_traverse_index (abfd, idx_vbn, cs))
+ if (!vms_traverse_index (abfd, idx_vbn, cs, recur_count + 1))
return FALSE;
}
else
/* Note: if the index is empty, there is no block to traverse. */
vbn = bfd_getl32 (idd.vbn);
- if (vbn != 0 && !vms_traverse_index (abfd, vbn, &csm))
+ if (vbn != 0 && !vms_traverse_index (abfd, vbn, &csm, 0))
{
if (csm.realloced)
free (csm.idx);
/* Standard function. */
-static const bfd_target *
+static bfd_cleanup
_bfd_vms_lib_archive_p (bfd *abfd, enum vms_lib_kind kind)
{
struct vms_lhd lhd;
if (sbm_off > reclen
|| reclen - sbm_off < sizeof (struct vms_dcxsbm))
- goto err;
+ {
+ err_free_buf:
+ free (buf);
+ goto err;
+ }
sbm = (struct vms_dcxsbm *) (buf + sbm_off);
sbm_sz = bfd_getl16 (sbm->size);
sbm_off += sbm_sz;
if (sbm_off > reclen)
- goto err;
+ goto err_free_buf;
sbmdesc->min_char = sbm->min_char;
BFD_ASSERT (sbmdesc->min_char == 0);
if (sbm_sz < sizeof (struct vms_dcxsbm) + l + sbm_len
|| (tdata->nbr_dcxsbm > 1
&& sbm_sz < sizeof (struct vms_dcxsbm) + l + 3 * sbm_len))
- goto err;
+ goto err_free_buf;
sbmdesc->flags = (unsigned char *)bfd_alloc (abfd, l);
off = bfd_getl16 (sbm->flags);
if (off > sbm_sz
|| sbm_sz - off < l)
- goto err;
+ goto err_free_buf;
memcpy (sbmdesc->flags, (bfd_byte *) sbm + off, l);
sbmdesc->nodes = (unsigned char *)bfd_alloc (abfd, 2 * sbm_len);
off = bfd_getl16 (sbm->nodes);
if (off > sbm_sz
|| sbm_sz - off < 2 * sbm_len)
- goto err;
+ goto err_free_buf;
memcpy (sbmdesc->nodes, (bfd_byte *) sbm + off, 2 * sbm_len);
off = bfd_getl16 (sbm->next);
if (off != 0)
{
if (off > sbm_sz
|| sbm_sz - off < 2 * sbm_len)
- goto err;
+ goto err_free_buf;
/* Read the 'next' array. */
sbmdesc->next = (unsigned short *) bfd_alloc (abfd, 2 * sbm_len);
buf1 = (bfd_byte *) sbm + off;
if (tdata->type == LBR__C_TYP_ESHSTB || tdata->type == LBR__C_TYP_ISHSTB)
abfd->is_thin_archive = TRUE;
- return abfd->xvec;
+ return _bfd_no_cleanup;
err:
bfd_release (abfd, tdata);
/* Standard function for alpha libraries. */
-const bfd_target *
+bfd_cleanup
_bfd_vms_lib_alpha_archive_p (bfd *abfd)
{
return _bfd_vms_lib_archive_p (abfd, vms_lib_alpha);
/* Standard function for ia64 libraries. */
-const bfd_target *
+bfd_cleanup
_bfd_vms_lib_ia64_archive_p (bfd *abfd)
{
return _bfd_vms_lib_archive_p (abfd, vms_lib_ia64);
/* Standard function for text libraries. */
-static const bfd_target *
+static bfd_cleanup
_bfd_vms_lib_txt_archive_p (bfd *abfd)
{
return _bfd_vms_lib_archive_p (abfd, vms_lib_txt);
break;
}
bfd_set_filename (res, newname);
+ free (newname);
+ if (bfd_get_filename (res) == NULL)
+ {
+ bfd_close (res);
+ return NULL;
+ }
tdata->cache[modidx] = res;
_bfd_vms_lib_get_imagelib_file (bfd *el)
{
bfd *archive = el->my_archive;
- const char *modname = el->filename;
+ const char *modname = bfd_get_filename (el);
int modlen = strlen (modname);
char *filename;
int j;
{
/* xgettext:c-format */
_bfd_error_handler(_("could not open shared image '%s' from '%s'"),
- filename, archive->filename);
+ filename, bfd_get_filename (archive));
bfd_release (archive, filename);
return NULL;
}
{
if (storage > syms_max)
{
- if (syms_max > 0)
- free (syms);
+ free (syms);
syms_max = storage;
syms = (asymbol **) bfd_malloc (syms_max);
if (syms == NULL)
return TRUE;
error_return:
- if (syms_max > 0)
- free (syms);
- if (map != NULL)
- free (map);
+ free (syms);
+ free (map);
return FALSE;
}
unsigned int nl;
modules[i].abfd = current;
- modules[i].name = vms_get_module_name (current->filename, FALSE);
+ modules[i].name = vms_get_module_name (bfd_get_filename (current), FALSE);
modules[i].ref = 1;
/* FIXME: silently truncate long names ? */