diff options
Diffstat (limited to 'binutils/rescoff.c')
-rw-r--r-- | binutils/rescoff.c | 62 |
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; } |