diff options
author | Alan Modra <amodra@gmail.com> | 2020-02-28 13:02:42 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-02-28 13:27:42 +1030 |
commit | 182ec6707c9fcca84d488413d4ddbbd9d12639fe (patch) | |
tree | 4d578febe41fc26faeff21ce597c5ecc3431101a /bfd/vms-lib.c | |
parent | 1b088c829ee812003d7601c7cf458dd394598719 (diff) | |
download | gdb-182ec6707c9fcca84d488413d4ddbbd9d12639fe.zip gdb-182ec6707c9fcca84d488413d4ddbbd9d12639fe.tar.gz gdb-182ec6707c9fcca84d488413d4ddbbd9d12639fe.tar.bz2 |
alpha-vms: memory leak
* vms-lib.c (_bfd_vms_lib_archive_p): Free memory on error paths.
Diffstat (limited to 'bfd/vms-lib.c')
-rw-r--r-- | bfd/vms-lib.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/bfd/vms-lib.c b/bfd/vms-lib.c index 29e213f8..65fd70a 100644 --- a/bfd/vms-lib.c +++ b/bfd/vms-lib.c @@ -623,12 +623,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 +642,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; |