diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-07-20 19:22:30 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-07-20 19:22:30 +0000 |
commit | 156f6ad80352423ffa9387e0d0a07d336a984824 (patch) | |
tree | 97eafbb442be17c4894ef8178bc0be140ef9ef3f | |
parent | 1364323a419500dd6b486eb6fc52d5afb83e82e6 (diff) | |
download | fsf-binutils-gdb-156f6ad80352423ffa9387e0d0a07d336a984824.zip fsf-binutils-gdb-156f6ad80352423ffa9387e0d0a07d336a984824.tar.gz fsf-binutils-gdb-156f6ad80352423ffa9387e0d0a07d336a984824.tar.bz2 |
bfd/
Fix false coff-go32-exe matches.
* coff-i386.c (TARGET_SYM) <_bfd_check_format>: Conditionally use
COFF_CHECK_FORMAT.
* coff-stgo32.c (go32_check_format): New forward declaration.
(COFF_CHECK_FORMAT): New defintion.
(go32_check_format): New function.
-rw-r--r-- | bfd/ChangeLog | 9 | ||||
-rw-r--r-- | bfd/coff-i386.c | 9 | ||||
-rw-r--r-- | bfd/coff-stgo32.c | 24 |
3 files changed, 40 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2540c65..97594a6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2011-07-20 Jan Kratochvil <jan.kratochvil@redhat.com> + + Fix false coff-go32-exe matches. + * coff-i386.c (TARGET_SYM) <_bfd_check_format>: Conditionally use + COFF_CHECK_FORMAT. + * coff-stgo32.c (go32_check_format): New forward declaration. + (COFF_CHECK_FORMAT): New defintion. + (go32_check_format): New function. + 2011-07-15 Alan Modra <amodra@gmail.com> * configure.in: Bump version. diff --git a/bfd/coff-i386.c b/bfd/coff-i386.c index 425a0c1..2f17a55 100644 --- a/bfd/coff-i386.c +++ b/bfd/coff-i386.c @@ -671,8 +671,13 @@ const bfd_target bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ /* Note that we allow an object file to be treated as a core file as well. */ - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, coff_object_p}, + /* bfd_check_format */ +#ifdef COFF_CHECK_FORMAT + {_bfd_dummy_target, COFF_CHECK_FORMAT, + bfd_generic_archive_p, COFF_CHECK_FORMAT}, +#else + {_bfd_dummy_target, coff_object_p, bfd_generic_archive_p, coff_object_p}, +#endif {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ bfd_false}, {bfd_false, coff_write_object_contents, /* bfd_write_contents */ diff --git a/bfd/coff-stgo32.c b/bfd/coff-stgo32.c index e0038cc..c10194e 100644 --- a/bfd/coff-stgo32.c +++ b/bfd/coff-stgo32.c @@ -95,6 +95,10 @@ create_go32_stub PARAMS ((bfd *)); #define COFF_ADJUST_AUX_OUT_PRE adjust_aux_out_pre #define COFF_ADJUST_AUX_OUT_POST adjust_aux_out_post +static const bfd_target *go32_check_format (bfd *abfd); + +#define COFF_CHECK_FORMAT go32_check_format + static bfd_boolean go32_stubbed_coff_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *)); @@ -414,3 +418,23 @@ go32_stubbed_coff_bfd_copy_private_bfd_data (ibfd, obfd) return TRUE; } + +/* coff_object_p only checks 2 bytes F_MAGIC at GO32_STUBSIZE inside the file + which is too fragile. */ + +static const bfd_target * +go32_check_format (bfd *abfd) +{ + char mz[2]; + + if (bfd_bread (mz, 2, abfd) != 2 || mz[0] != 'M' || mz[1] != 'Z') + { + bfd_set_error (bfd_error_wrong_format); + return NULL; + } + + if (bfd_seek (abfd, 0, SEEK_SET) != 0) + return NULL; + + return coff_object_p (abfd); +} |