From ee97c5f0125e8f07ee53934bf607c5d518959cac Mon Sep 17 00:00:00 2001 From: Shoaib Meenai Date: Sun, 14 May 2017 18:34:56 +0000 Subject: [PATCH] [COFF] Gracefully handle empty .drectve sections Running `llvm-readobj -coff-directives msvcrt.lib` resulted in this error: Invalid data was encountered while parsing the file This happened because some of the object files in the archive have empty `.drectve` sections. These empty sections result in a `parse_failed` error being returned from `COFFObjectFile::getSectionContents()`, which in turn caused `llvm-readobj` to stop. With this change, `getSectionContents` now returns success, and like before the resulting array is empty. Patch by Dave Lee. Differential Revision: https://reviews.llvm.org/D32652 llvm-svn: 303014 --- llvm/lib/Object/COFFObjectFile.cpp | 2 +- llvm/test/Object/Inputs/COFF/empty-drectve.yaml | 14 ++++++++++++++ llvm/test/Object/coff-empty-drectve.test | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 llvm/test/Object/Inputs/COFF/empty-drectve.yaml create mode 100644 llvm/test/Object/coff-empty-drectve.test diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index b7e4479bcadc..28531feccfe1 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -1062,7 +1062,7 @@ COFFObjectFile::getSectionContents(const coff_section *Sec, // In COFF, a virtual section won't have any in-file // content, so the file pointer to the content will be zero. if (Sec->PointerToRawData == 0) - return object_error::parse_failed; + return std::error_code(); // The only thing that we need to verify is that the contents is contained // within the file bounds. We don't need to make sure it doesn't cover other // data, as there's nothing that says that is not allowed. diff --git a/llvm/test/Object/Inputs/COFF/empty-drectve.yaml b/llvm/test/Object/Inputs/COFF/empty-drectve.yaml new file mode 100644 index 000000000000..af288807e3ad --- /dev/null +++ b/llvm/test/Object/Inputs/COFF/empty-drectve.yaml @@ -0,0 +1,14 @@ +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_I386 +sections: + - Name: .drectve + Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ] + SectionData: '' +symbols: + - Name: .drectve + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC diff --git a/llvm/test/Object/coff-empty-drectve.test b/llvm/test/Object/coff-empty-drectve.test new file mode 100644 index 000000000000..f76d7bf72716 --- /dev/null +++ b/llvm/test/Object/coff-empty-drectve.test @@ -0,0 +1,3 @@ +RUN: yaml2obj %p/Inputs/COFF/empty-drectve.yaml | llvm-readobj -coff-directives - | FileCheck %s + +CHECK: Directive(s): {{$}}