This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH 3/5] remove deleted BFDs from the archive cache
Alan> Only a few? :)
:)
[...]
Alan> There's a "return NULL" a few line down from here where you should
Alan> free allocptr.
[...]
Alan> Ditto for a few lines before here. Other than that, this looks like a
Alan> nice cleanup. Thanks!
Thanks for the review. Here is what I am checking in.
Tom
2012-08-20 Tom Tromey <tromey@redhat.com>
* vms-lib.c (_bfd_vms_lib_get_module): Use bfd_zmalloc for
areltdata.
* opncls.c (_bfd_delete_bfd): Free arelt_data.
* mach-o.c (bfd_mach_o_fat_member_init): Use bfd_zmalloc for
areltdata.
* ecoff.c (_bfd_ecoff_slurp_armap): Use free for mapdata.
* coff-rs6000.c (_bfd_xcoff_read_ar_hdr): Use bfd_zmalloc for
areltdata.
(xcoff_write_archive_contents_old): Likewise.
(xcoff_write_archive_contents_big): Likewise.
* archive64.c (bfd_elf64_archive_slurp_armap): Use free for
areltdata.
* archive.c (_bfd_generic_read_ar_hdr_mag): Use bfd_zmalloc and
free for areltdata.
(_bfd_get_elt_at_filepos): Likewise. Clear n_nfd->arelt_data on
failure.
(do_slurp_bsd_armap): Use bfd_zmalloc and free for areltdata.
(do_slurp_coff_armap): Likewise.
(_bfd_slurp_extended_name_table): Likewise.
(bfd_slurp_bsd_armap_f2): Likewise. Don't leak 'mapdata'.
Index: archive.c
===================================================================
RCS file: /cvs/src/src/bfd/archive.c,v
retrieving revision 1.91
diff -u -r1.91 archive.c
--- archive.c 17 Aug 2012 01:06:27 -0000 1.91
+++ archive.c 20 Aug 2012 14:31:05 -0000
@@ -517,7 +517,7 @@
parsed_size -= namelen;
extra_size = namelen;
- allocptr = (char *) bfd_zalloc (abfd, allocsize);
+ allocptr = (char *) bfd_zmalloc (allocsize);
if (allocptr == NULL)
return NULL;
filename = (allocptr
@@ -525,6 +525,7 @@
+ sizeof (struct ar_hdr));
if (bfd_bread (filename, namelen, abfd) != namelen)
{
+ free (allocptr);
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_no_more_archived_files);
return NULL;
@@ -560,7 +561,7 @@
if (!allocptr)
{
- allocptr = (char *) bfd_zalloc (abfd, allocsize);
+ allocptr = (char *) bfd_zmalloc (allocsize);
if (allocptr == NULL)
return NULL;
}
@@ -643,7 +644,10 @@
{
filename = _bfd_append_relative_path (archive, filename);
if (filename == NULL)
- return NULL;
+ {
+ free (new_areldata);
+ return NULL;
+ }
}
if (new_areldata->origin > 0)
@@ -655,13 +659,13 @@
if (ext_arch == NULL
|| ! bfd_check_format (ext_arch, bfd_archive))
{
- bfd_release (archive, new_areldata);
+ free (new_areldata);
return NULL;
}
n_nfd = _bfd_get_elt_at_filepos (ext_arch, new_areldata->origin);
if (n_nfd == NULL)
{
- bfd_release (archive, new_areldata);
+ free (new_areldata);
return NULL;
}
n_nfd->proxy_origin = bfd_tell (archive);
@@ -683,7 +687,7 @@
if (n_nfd == NULL)
{
- bfd_release (archive, new_areldata);
+ free (new_areldata);
return NULL;
}
@@ -707,7 +711,8 @@
if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd))
return n_nfd;
- bfd_release (archive, new_areldata);
+ free (new_areldata);
+ n_nfd->arelt_data = NULL;
return NULL;
}
@@ -894,7 +899,7 @@
if (mapdata == NULL)
return FALSE;
parsed_size = mapdata->parsed_size;
- bfd_release (abfd, mapdata); /* Don't need it any more. */
+ free (mapdata);
raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size);
if (raw_armap == NULL)
@@ -970,7 +975,7 @@
if (mapdata == NULL)
return FALSE;
parsed_size = mapdata->parsed_size;
- bfd_release (abfd, mapdata); /* Don't need it any more. */
+ free (mapdata);
if (bfd_bread (int_buf, 4, abfd) != 4)
{
@@ -1063,7 +1068,7 @@
ardata->first_file_filepos +=
(tmp->parsed_size + sizeof (struct ar_hdr) + 1) & ~(unsigned) 1;
}
- bfd_release (abfd, tmp);
+ free (tmp);
}
}
@@ -1180,15 +1185,17 @@
if (mapdata->parsed_size < HPUX_SYMDEF_COUNT_SIZE + BSD_STRING_COUNT_SIZE)
{
+ free (mapdata);
wrong_format:
bfd_set_error (bfd_error_wrong_format);
byebye:
- bfd_release (abfd, mapdata);
return FALSE;
}
left = mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE - BSD_STRING_COUNT_SIZE;
amt = mapdata->parsed_size;
+ free (mapdata);
+
raw_armap = (bfd_byte *) bfd_zalloc (abfd, amt);
if (raw_armap == NULL)
goto byebye;
@@ -1290,7 +1297,7 @@
if (bfd_ardata (abfd)->extended_names == NULL)
{
byebye:
- bfd_release (abfd, namedata);
+ free (namedata);
return FALSE;
}
@@ -1327,8 +1334,7 @@
bfd_ardata (abfd)->first_file_filepos +=
(bfd_ardata (abfd)->first_file_filepos) % 2;
- /* FIXME, we can't release namedata here because it was allocated
- below extended_names on the objalloc... */
+ free (namedata);
}
return TRUE;
}
Index: archive64.c
===================================================================
RCS file: /cvs/src/src/bfd/archive64.c,v
retrieving revision 1.15
diff -u -r1.15 archive64.c
--- archive64.c 20 Jan 2012 14:42:57 -0000 1.15
+++ archive64.c 20 Aug 2012 14:31:05 -0000
@@ -77,7 +77,7 @@
if (mapdata == NULL)
return FALSE;
parsed_size = mapdata->parsed_size;
- bfd_release (abfd, mapdata);
+ free (mapdata);
if (bfd_bread (int_buf, 8, abfd) != 8)
{
Index: coff-rs6000.c
===================================================================
RCS file: /cvs/src/src/bfd/coff-rs6000.c,v
retrieving revision 1.106
diff -u -r1.106 coff-rs6000.c
--- coff-rs6000.c 24 Jul 2012 21:06:57 -0000 1.106
+++ coff-rs6000.c 20 Aug 2012 14:31:05 -0000
@@ -1496,7 +1496,7 @@
struct areltdata *ret;
bfd_size_type amt = sizeof (struct areltdata);
- ret = (struct areltdata *) bfd_alloc (abfd, amt);
+ ret = (struct areltdata *) bfd_zmalloc (amt);
if (ret == NULL)
return NULL;
@@ -2113,7 +2113,7 @@
total_namlen += strlen (normalize_filename (sub)) + 1;
if (sub->arelt_data == NULL)
{
- sub->arelt_data = bfd_zalloc (sub, sizeof (struct areltdata));
+ sub->arelt_data = bfd_zmalloc (sizeof (struct areltdata));
if (sub->arelt_data == NULL)
return FALSE;
}
@@ -2329,7 +2329,7 @@
if (current_bfd->arelt_data == NULL)
{
size = sizeof (struct areltdata);
- current_bfd->arelt_data = bfd_zalloc (current_bfd, size);
+ current_bfd->arelt_data = bfd_zmalloc (size);
if (current_bfd->arelt_data == NULL)
return FALSE;
}
Index: ecoff.c
===================================================================
RCS file: /cvs/src/src/bfd/ecoff.c,v
retrieving revision 1.76
diff -u -r1.76 ecoff.c
--- ecoff.c 13 Jul 2012 14:22:45 -0000 1.76
+++ ecoff.c 20 Aug 2012 14:31:06 -0000
@@ -2904,7 +2904,7 @@
if (mapdata == NULL)
return FALSE;
parsed_size = mapdata->parsed_size;
- bfd_release (abfd, (void *) mapdata);
+ free (mapdata);
raw_armap = (char *) bfd_alloc (abfd, parsed_size);
if (raw_armap == NULL)
Index: mach-o.c
===================================================================
RCS file: /cvs/src/src/bfd/mach-o.c,v
retrieving revision 1.103
diff -u -r1.103 mach-o.c
--- mach-o.c 24 Jul 2012 21:06:58 -0000 1.103
+++ mach-o.c 20 Aug 2012 14:31:06 -0000
@@ -4294,7 +4294,7 @@
abfd->filename = name;
}
- areltdata = bfd_zalloc (abfd, sizeof (struct areltdata));
+ areltdata = bfd_zmalloc (sizeof (struct areltdata));
areltdata->parsed_size = entry->size;
abfd->arelt_data = areltdata;
abfd->iostream = NULL;
Index: opncls.c
===================================================================
RCS file: /cvs/src/src/bfd/opncls.c,v
retrieving revision 1.72
diff -u -r1.72 opncls.c
--- opncls.c 9 Aug 2012 06:25:53 -0000 1.72
+++ opncls.c 20 Aug 2012 14:31:06 -0000
@@ -136,6 +136,7 @@
objalloc_free ((struct objalloc *) abfd->memory);
}
+ free (abfd->arelt_data);
free (abfd);
}
Index: vms-lib.c
===================================================================
RCS file: /cvs/src/src/bfd/vms-lib.c,v
retrieving revision 1.23
diff -u -r1.23 vms-lib.c
--- vms-lib.c 13 Jul 2012 14:22:50 -0000 1.23
+++ vms-lib.c 20 Aug 2012 14:31:06 -0000
@@ -1,6 +1,6 @@
/* BFD back-end for VMS archive files.
- Copyright 2010, 2011 Free Software Foundation, Inc.
+ Copyright 2010, 2011, 2012 Free Software Foundation, Inc.
Written by Tristan Gingold <gingold@adacore.com>, AdaCore.
This file is part of BFD, the Binary File Descriptor library.
@@ -1337,7 +1337,7 @@
res = _bfd_create_empty_archive_element_shell (abfd);
if (res == NULL)
return NULL;
- arelt = bfd_zalloc (res, sizeof (*arelt));
+ arelt = bfd_zmalloc (sizeof (*arelt));
if (arelt == NULL)
return NULL;
res->arelt_data = arelt;