X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fvms-lib.c;h=f000bc2a8f1fbf08fd9db209a0d872deb8090dc0;hb=1e92785005ce880a5fac9d022f05cdcff91c3091;hp=29e213f8c39fd6bbb05c6f8be0a583ea79d3e5be;hpb=cc4c4f40a2b46e355684e450f59154cece591c39;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/vms-lib.c b/bfd/vms-lib.c index 29e213f8c3..f000bc2a8f 100644 --- a/bfd/vms-lib.c +++ b/bfd/vms-lib.c @@ -242,7 +242,8 @@ vms_write_block (bfd *abfd, unsigned int vbn, void *blk) 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; @@ -250,6 +251,12 @@ vms_traverse_index (bfd *abfd, unsigned int vbn, struct carsym_mem *cs) 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)) @@ -307,7 +314,7 @@ vms_traverse_index (bfd *abfd, unsigned int vbn, struct carsym_mem *cs) 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 @@ -454,7 +461,7 @@ vms_lib_read_index (bfd *abfd, int idx, unsigned int *nbrel) /* 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); @@ -482,7 +489,7 @@ vms_lib_read_index (bfd *abfd, int idx, unsigned int *nbrel) /* 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; @@ -623,12 +630,16 @@ _bfd_vms_lib_archive_p (bfd *abfd, enum vms_lib_kind kind) 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); @@ -638,25 +649,25 @@ _bfd_vms_lib_archive_p (bfd *abfd, enum vms_lib_kind kind) 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; @@ -682,7 +693,7 @@ _bfd_vms_lib_archive_p (bfd *abfd, enum vms_lib_kind kind) 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); @@ -692,7 +703,7 @@ _bfd_vms_lib_archive_p (bfd *abfd, enum vms_lib_kind kind) /* 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); @@ -700,7 +711,7 @@ _bfd_vms_lib_alpha_archive_p (bfd *abfd) /* 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); @@ -708,7 +719,7 @@ _bfd_vms_lib_ia64_archive_p (bfd *abfd) /* 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); @@ -1441,6 +1452,12 @@ _bfd_vms_lib_get_module (bfd *abfd, unsigned int modidx) break; } bfd_set_filename (res, newname); + free (newname); + if (bfd_get_filename (res) == NULL) + { + bfd_close (res); + return NULL; + } tdata->cache[modidx] = res; @@ -1480,7 +1497,7 @@ bfd * _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; @@ -1506,7 +1523,7 @@ _bfd_vms_lib_get_imagelib_file (bfd *el) { /* 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; } @@ -2028,8 +2045,7 @@ _bfd_vms_lib_build_map (unsigned int nbr_modules, { if (storage > syms_max) { - if (syms_max > 0) - free (syms); + free (syms); syms_max = storage; syms = (asymbol **) bfd_malloc (syms_max); if (syms == NULL) @@ -2080,10 +2096,8 @@ _bfd_vms_lib_build_map (unsigned int nbr_modules, return TRUE; error_return: - if (syms_max > 0) - free (syms); - if (map != NULL) - free (map); + free (syms); + free (map); return FALSE; } @@ -2141,7 +2155,7 @@ _bfd_vms_lib_write_archive_contents (bfd *arch) 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 ? */