aboutsummaryrefslogtreecommitdiff
path: root/binutils/rescoff.c
diff options
context:
space:
mode:
Diffstat (limited to 'binutils/rescoff.c')
-rw-r--r--binutils/rescoff.c62
1 files changed, 44 insertions, 18 deletions
diff --git a/binutils/rescoff.c b/binutils/rescoff.c
index 88b5f34..14546a4 100644
--- a/binutils/rescoff.c
+++ b/binutils/rescoff.c
@@ -138,12 +138,14 @@ read_coff_rsrc (const char *filename, const char *target)
if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
list_matching_formats (matching);
free (matching);
+ bfd_close (abfd);
return NULL;
}
if (bfd_get_flavour (abfd) != bfd_target_coff_flavour
|| !obj_pe (abfd))
{
non_fatal (_("%s: not a PE file"), filename);
+ bfd_close (abfd);
return NULL;
}
@@ -151,6 +153,7 @@ read_coff_rsrc (const char *filename, const char *target)
if (sec == NULL)
{
non_fatal (_("%s: no resource section"), filename);
+ bfd_close (abfd);
return NULL;
}
@@ -163,6 +166,7 @@ read_coff_rsrc (const char *filename, const char *target)
if (size > (bfd_size_type) get_file_size (filename))
{
non_fatal (_("%s: .rsrc section is bigger than the file!"), filename);
+ bfd_close (abfd);
return NULL;
}
@@ -228,14 +232,14 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
erd = (const struct extern_res_directory *) data;
rd = (rc_res_directory *) res_alloc (sizeof (rc_res_directory));
- rd->characteristics = windres_get_32 (wrbfd, erd->characteristics, 4);
- rd->time = windres_get_32 (wrbfd, erd->time, 4);
- rd->major = windres_get_16 (wrbfd, erd->major, 2);
- rd->minor = windres_get_16 (wrbfd, erd->minor, 2);
+ rd->characteristics = windres_get_32 (wrbfd, erd->characteristics);
+ rd->time = windres_get_32 (wrbfd, erd->time);
+ rd->major = windres_get_16 (wrbfd, erd->major);
+ rd->minor = windres_get_16 (wrbfd, erd->minor);
rd->entries = NULL;
- name_count = windres_get_16 (wrbfd, erd->name_count, 2);
- id_count = windres_get_16 (wrbfd, erd->id_count, 2);
+ name_count = windres_get_16 (wrbfd, erd->name_count);
+ id_count = windres_get_16 (wrbfd, erd->id_count);
pp = &rd->entries;
@@ -257,8 +261,8 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
- name = windres_get_32 (wrbfd, ere->name, 4);
- rva = windres_get_32 (wrbfd, ere->rva, 4);
+ name = windres_get_32 (wrbfd, ere->name);
+ rva = windres_get_32 (wrbfd, ere->rva);
/* For some reason the high bit in NAME is set. */
name &=~ 0x80000000;
@@ -275,7 +279,7 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
overrun (flaginfo, _("resource name"));
return NULL;
}
- length = windres_get_16 (wrbfd, ers, 2);
+ length = windres_get_16 (wrbfd, ers);
/* PR 17512: file: 05dc4a16. */
if (length * 2 + 4 > flaginfo->data_end - ers)
{
@@ -288,7 +292,7 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
re->id.u.n.length = length;
re->id.u.n.name = (unichar *) res_alloc (length * sizeof (unichar));
for (j = 0; j < length; j++)
- re->id.u.n.name[j] = windres_get_16 (wrbfd, ers + j * 2 + 2, 2);
+ re->id.u.n.name[j] = windres_get_16 (wrbfd, ers + j * 2 + 2);
if (level == 0)
type = &re->id;
@@ -333,8 +337,8 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
- name = windres_get_32 (wrbfd, ere->name, 4);
- rva = windres_get_32 (wrbfd, ere->rva, 4);
+ name = windres_get_32 (wrbfd, ere->name);
+ rva = windres_get_32 (wrbfd, ere->rva);
re = (rc_res_entry *) res_alloc (sizeof *re);
re->next = NULL;
@@ -401,8 +405,8 @@ read_coff_data_entry (windres_bfd *wrbfd, const bfd_byte *data,
erd = (const struct extern_res_data *) data;
- size = windres_get_32 (wrbfd, erd->size, 4);
- rva = windres_get_32 (wrbfd, erd->rva, 4);
+ size = windres_get_32 (wrbfd, erd->size);
+ rva = windres_get_32 (wrbfd, erd->rva);
if (rva < flaginfo->secaddr
|| rva - flaginfo->secaddr >= (rc_uint_type) (flaginfo->data_end - flaginfo->data))
{
@@ -422,8 +426,8 @@ read_coff_data_entry (windres_bfd *wrbfd, const bfd_byte *data,
if (r != NULL)
{
memset (&r->res_info, 0, sizeof (rc_res_res_info));
- r->coff_info.codepage = windres_get_32 (wrbfd, erd->codepage, 4);
- r->coff_info.reserved = windres_get_32 (wrbfd, erd->reserved, 4);
+ r->coff_info.codepage = windres_get_32 (wrbfd, erd->codepage);
+ r->coff_info.reserved = windres_get_32 (wrbfd, erd->reserved);
}
return r;
@@ -528,6 +532,7 @@ write_coff_file (const char *filename, const char *target,
if (! bfd_set_format (abfd, bfd_object))
{
bfd_nonfatal ("bfd_set_format");
+ bfd_close_all_done (abfd);
return false;
}
@@ -535,24 +540,28 @@ write_coff_file (const char *filename, const char *target,
if (! bfd_set_arch_mach (abfd, bfd_arch_sh, 0))
{
bfd_nonfatal ("bfd_set_arch_mach(sh)");
+ bfd_close_all_done (abfd);
return false;
}
#elif defined DLLTOOL_MIPS
if (! bfd_set_arch_mach (abfd, bfd_arch_mips, 0))
{
bfd_nonfatal ("bfd_set_arch_mach(mips)");
+ bfd_close_all_done (abfd);
return false;
}
#elif defined DLLTOOL_ARM
if (! bfd_set_arch_mach (abfd, bfd_arch_arm, 0))
{
bfd_nonfatal ("bfd_set_arch_mach(arm)");
+ bfd_close_all_done (abfd);
return false;
}
#elif defined DLLTOOL_AARCH64
if (! bfd_set_arch_mach (abfd, bfd_arch_aarch64, 0))
{
bfd_nonfatal ("bfd_set_arch_mach(aarch64)");
+ bfd_close_all_done (abfd);
return false;
}
#else
@@ -560,6 +569,7 @@ write_coff_file (const char *filename, const char *target,
if (! bfd_set_arch_mach (abfd, bfd_arch_i386, 0))
{
bfd_nonfatal ("bfd_set_arch_mach(i386)");
+ bfd_close_all_done (abfd);
return false;
}
#endif
@@ -567,6 +577,7 @@ write_coff_file (const char *filename, const char *target,
if (! bfd_set_file_flags (abfd, HAS_SYMS | HAS_RELOC))
{
bfd_nonfatal ("bfd_set_file_flags");
+ bfd_close_all_done (abfd);
return false;
}
@@ -576,12 +587,14 @@ write_coff_file (const char *filename, const char *target,
if (sec == NULL)
{
bfd_nonfatal ("bfd_make_section");
+ bfd_close_all_done (abfd);
return false;
}
if (! bfd_set_symtab (abfd, &sec->symbol, 1))
{
bfd_nonfatal ("bfd_set_symtab");
+ bfd_close_all_done (abfd);
return false;
}
@@ -628,7 +641,11 @@ write_coff_file (const char *filename, const char *target,
/* Actually convert the resources to binary. */
if (!coff_to_bin (resources, &cwi))
- return false;
+ {
+ bfd_close_all_done (abfd);
+ free (cwi.relocs);
+ return false;
+ }
/* Add another few bytes to the directory strings if needed for
alignment. */
@@ -655,6 +672,8 @@ write_coff_file (const char *filename, const char *target,
if (!bfd_set_section_size (sec, length))
{
bfd_nonfatal ("bfd_set_section_size");
+ bfd_close_all_done (abfd);
+ free (cwi.relocs);
return false;
}
@@ -666,6 +685,8 @@ write_coff_file (const char *filename, const char *target,
if (! bfd_set_section_contents (abfd, sec, d->data, offset, d->length))
{
bfd_nonfatal ("bfd_set_section_contents");
+ bfd_close_all_done (abfd);
+ free (cwi.relocs);
return false;
}
offset += d->length;
@@ -684,7 +705,11 @@ write_coff_file (const char *filename, const char *target,
{
if (res_to_bin (cwi.wrbfd, (rc_uint_type) offset, rd->res)
== (rc_uint_type) -1)
- return false;
+ {
+ bfd_close_all_done (abfd);
+ free (cwi.relocs);
+ return false;
+ }
offset += rd->length;
}
@@ -693,6 +718,7 @@ write_coff_file (const char *filename, const char *target,
if (! bfd_close (abfd))
{
bfd_nonfatal ("bfd_close");
+ free (cwi.relocs);
return false;
}