diff options
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/vms-alpha.c | 34 |
2 files changed, 28 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 809f1ba..02e3cab 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,11 @@ 2019-12-30 Alan Modra <amodra@gmail.com> + * vms-alpha.c (alpha_vms_free_private): New function, extracted.. + (vms_close_and_cleanup): ..from here. + (alpha_vms_object_p): Call alpha_vms_free_private on failure. + +2019-12-30 Alan Modra <amodra@gmail.com> + * coffgen.c (coff_real_object_p): Free malloc'd memory on failure. 2019-12-30 Alan Modra <amodra@gmail.com> diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c index 6a08761..e4928d7 100644 --- a/bfd/vms-alpha.c +++ b/bfd/vms-alpha.c @@ -2634,6 +2634,22 @@ vms_initialize (bfd * abfd) return FALSE; } +/* Free malloc'd memory. */ + +static void +alpha_vms_free_private (bfd *abfd) +{ + struct module *module; + + free (PRIV (recrd.buf)); + free (PRIV (sections)); + free (PRIV (syms)); + free (PRIV (dst_ptr_offsets)); + + for (module = PRIV (modules); module; module = module->next) + free (module->file_table); +} + /* Check the format for a file being read. Return a (bfd_target *) if it's an object file or zero if not. */ @@ -2648,7 +2664,10 @@ alpha_vms_object_p (bfd *abfd) /* Allocate alpha-vms specific data. */ if (!vms_initialize (abfd)) - goto error_ret; + { + abfd->tdata.any = tdata_save; + return NULL; + } if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)) goto err_wrong_format; @@ -2788,8 +2807,7 @@ alpha_vms_object_p (bfd *abfd) bfd_set_error (bfd_error_wrong_format); error_ret: - if (PRIV (recrd.buf)) - free (PRIV (recrd.buf)); + alpha_vms_free_private (abfd); if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL) bfd_release (abfd, abfd->tdata.any); abfd->tdata.any = tdata_save; @@ -9339,15 +9357,7 @@ vms_close_and_cleanup (bfd * abfd) if (abfd->format == bfd_object) { - struct module *module; - - free (PRIV (recrd.buf)); - free (PRIV (sections)); - free (PRIV (syms)); - free (PRIV (dst_ptr_offsets)); - - for (module = PRIV (modules); module; module = module->next) - free (module->file_table); + alpha_vms_free_private (abfd); #ifdef VMS if (abfd->direction == write_direction) |