PING [PATCH] gold: Call gold_fatal on bad ELF inputs
H.J. Lu
hjl.tools@gmail.com
Sun Nov 8 12:16:44 GMT 2020
On Sun, Oct 18, 2020 at 6:36 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> Abort on bad ELF inputs instead of SEGV later.
>
> elfcpp/
>
> PR gold/26747
> PR gold/26748
> * elfcpp_file.h (Elf_file<size, big_endian, File>::construct):
> Call file->fatal instead of file->error.
>
> gold/
>
> PR gold/26747
> PR gold/26748
> * incremental.cc (Incremental_binary::fatal): New.
> * incremental.h (Incremental_binary::fatal): Likewise.
> * nacl.cc (Sniff_file::fatal): Likewise.
> * nacl.h (Sniff_file::fatal): Likewise.
> * object.cc (Object::fatal): Likewise.
> * object.h (Object::fatal): Likewise.
> ---
> elfcpp/elfcpp_file.h | 4 ++--
> gold/incremental.cc | 16 ++++++++++++++++
> gold/incremental.h | 4 ++++
> gold/nacl.cc | 14 ++++++++++++++
> gold/nacl.h | 4 ++++
> gold/object.cc | 17 +++++++++++++++++
> gold/object.h | 4 ++++
> 7 files changed, 61 insertions(+), 2 deletions(-)
>
> diff --git a/elfcpp/elfcpp_file.h b/elfcpp/elfcpp_file.h
> index 92898c37646..a7213b2ea32 100644
> --- a/elfcpp/elfcpp_file.h
> +++ b/elfcpp/elfcpp_file.h
> @@ -410,10 +410,10 @@ Elf_file<size, big_endian, File>::construct(File* file, const Ef_ehdr& ehdr)
> this->shstrndx_ = ehdr.get_e_shstrndx();
> this->large_shndx_offset_ = 0;
> if (ehdr.get_e_ehsize() != This::ehdr_size)
> - file->error(_("bad e_ehsize (%d != %d)"),
> + file->fatal(_("bad e_ehsize (%d != %d)"),
> ehdr.get_e_ehsize(), This::ehdr_size);
> if (ehdr.get_e_shentsize() != This::shdr_size)
> - file->error(_("bad e_shentsize (%d != %d)"),
> + file->fatal(_("bad e_shentsize (%d != %d)"),
> ehdr.get_e_shentsize(), This::shdr_size);
> }
>
> diff --git a/gold/incremental.cc b/gold/incremental.cc
> index 8d0df2d7bcc..a30a5c6e699 100644
> --- a/gold/incremental.cc
> +++ b/gold/incremental.cc
> @@ -171,6 +171,22 @@ Incremental_binary::error(const char* format, ...) const
> va_end(args);
> }
>
> +// Report a fatal error.
> +
> +void
> +Incremental_binary::fatal(const char* format, ...) const
> +{
> + va_list args;
> + va_start(args, format);
> + // Current code only checks if the file can be used for incremental linking,
> + // so errors shouldn't fail the build, but only result in a fallback to a
> + // full build.
> + // TODO: when we implement incremental editing of the file, we may need a
> + // flag that will cause errors to be treated seriously.
> + vexplain_no_incremental(format, args);
> + va_end(args);
> +}
> +
> // Return TRUE if a section of type SH_TYPE can be updated in place
> // during an incremental update. We can update sections of type PROGBITS,
> // NOBITS, INIT_ARRAY, FINI_ARRAY, PREINIT_ARRAY, NOTE, and
> diff --git a/gold/incremental.h b/gold/incremental.h
> index e072b96fcb2..eb1d1aac6cd 100644
> --- a/gold/incremental.h
> +++ b/gold/incremental.h
> @@ -1360,6 +1360,10 @@ class Incremental_binary
> void
> error(const char* format, ...) const ATTRIBUTE_PRINTF_2;
>
> + // Report a fatal error.
> + void
> + fatal(const char* format, ...) const ATTRIBUTE_PRINTF_2;
> +
> // Proxy class for a sized Incremental_input_entry_reader.
>
> class Input_reader
> diff --git a/gold/nacl.cc b/gold/nacl.cc
> index 115d9912f28..8e07c946a6f 100644
> --- a/gold/nacl.cc
> +++ b/gold/nacl.cc
> @@ -44,4 +44,18 @@ Sniff_file::error(const char* format, ...) const
> free(buf);
> }
>
> +// Copied from object.cc:Object::fatal.
> +void
> +Sniff_file::fatal(const char* format, ...) const
> +{
> + va_list args;
> + va_start(args, format);
> + char* buf = NULL;
> + if (vasprintf(&buf, format, args) < 0)
> + gold_nomem();
> + va_end(args);
> + gold_fatal(_("%s: %s"), this->file_.filename().c_str(), buf);
> + free(buf);
> +}
> +
> } // end namespace gold
> diff --git a/gold/nacl.h b/gold/nacl.h
> index 5b3dac5e5b9..2f093e33f5a 100644
> --- a/gold/nacl.h
> +++ b/gold/nacl.h
> @@ -84,6 +84,10 @@ class Sniff_file
> void
> error(const char* format, ...) const ATTRIBUTE_PRINTF_2;
>
> + // Report a fatal error.
> + void
> + fatal(const char* format, ...) const ATTRIBUTE_PRINTF_2;
> +
> private:
> File_read& file_;
> off_t offset_;
> diff --git a/gold/object.cc b/gold/object.cc
> index c486a2011d5..498e58e2b01 100644
> --- a/gold/object.cc
> +++ b/gold/object.cc
> @@ -175,6 +175,23 @@ Object::error(const char* format, ...) const
> free(buf);
> }
>
> +// Report a fatal error for this object file. This is used by the
> +// elfcpp::Elf_file interface, and also called by the Object code
> +// itself.
> +
> +void
> +Object::fatal(const char* format, ...) const
> +{
> + va_list args;
> + va_start(args, format);
> + char* buf = NULL;
> + if (vasprintf(&buf, format, args) < 0)
> + gold_nomem();
> + va_end(args);
> + gold_fatal(_("%s: %s"), this->name().c_str(), buf);
> + free(buf);
> +}
> +
> // Return a view of the contents of a section.
>
> const unsigned char*
> diff --git a/gold/object.h b/gold/object.h
> index b7bd38faaf8..656443f062b 100644
> --- a/gold/object.h
> +++ b/gold/object.h
> @@ -706,6 +706,10 @@ class Object
> void
> error(const char* format, ...) const ATTRIBUTE_PRINTF_2;
>
> + // Report a fatal error.
> + void
> + fatal(const char* format, ...) const ATTRIBUTE_PRINTF_2;
> +
> // A location in the file.
> struct Location
> {
> --
> 2.26.2
>
PING:
https://sourceware.org/pipermail/binutils/2020-October/113750.html
--
H.J.
More information about the Binutils
mailing list