[PATCH] D103546: Added ELFObjectFileBase::checkMagic() for checking ELF magic word.
Vyacheslav Zakharin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 2 11:43:02 PDT 2021
vzakhari created this revision.
vzakhari requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Added new method to ELFObjectFileBase to check whether the ELF image used to construct it is actually an ELF image (i.e. it has ELF magic word).
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D103546
Files:
llvm/include/llvm/Object/ELFObjectFile.h
llvm/unittests/Object/ELFObjectFileTest.cpp
Index: llvm/unittests/Object/ELFObjectFileTest.cpp
===================================================================
--- llvm/unittests/Object/ELFObjectFileTest.cpp
+++ llvm/unittests/Object/ELFObjectFileTest.cpp
@@ -22,7 +22,7 @@
struct DataForTest {
std::vector<uint8_t> Data;
- template <typename T>
+ template <typename T> static
std::vector<uint8_t> makeElfData(uint8_t Class, uint8_t Encoding,
uint16_t Machine) {
T Ehdr{}; // Zero-initialise the header.
@@ -590,3 +590,26 @@
DoCheck(OverLimitNumBlocks,
"ULEB128 value at offset 0x8 exceeds UINT32_MAX (0x100000000)");
}
+
+TEST(ELFObjectFileTest, InvalidMagicTest) {
+ std::vector<uint8_t> Data =
+ DataForTest::makeElfData<ELF::Elf64_Ehdr>(
+ ELF::ELFCLASS32, ELF::ELFDATA2LSB, ELF::EM_NONE);
+ // Replace the ELF with an ORC.
+ Data[ELF::EI_MAG1] = 'O';
+ Data[ELF::EI_MAG2] = 'R';
+ Data[ELF::EI_MAG3] = 'C';
+
+ // In the current implementation the data is still recognized
+ // as an ELF even though it is an ORC.
+ Expected<std::unique_ptr<ObjectFile>> ELFObjOrErr =
+ object::ObjectFile::createELFObjectFile(
+ MemoryBufferRef(toStringRef(Data), "dummyELF"));
+ ASSERT_THAT_EXPECTED(ELFObjOrErr, Succeeded());
+
+ auto *Object = dyn_cast<const ELFObjectFileBase>(ELFObjOrErr->get());
+ // It should be a valid ELFObjectFileBase object.
+ EXPECT_TRUE(Object != nullptr);
+ // checkMagic() recognizes a real ELF.
+ EXPECT_TRUE(!Object->checkMagic());
+}
Index: llvm/include/llvm/Object/ELFObjectFile.h
===================================================================
--- llvm/include/llvm/Object/ELFObjectFile.h
+++ llvm/include/llvm/Object/ELFObjectFile.h
@@ -96,6 +96,8 @@
std::vector<std::pair<Optional<DataRefImpl>, uint64_t>>
getPltAddresses() const;
+
+ virtual bool checkMagic() const = 0;
};
class ELFSectionRef : public SectionRef {
@@ -229,6 +231,7 @@
uint16_t getEMachine() const override;
uint16_t getEType() const override;
uint64_t getSymbolSize(DataRefImpl Sym) const override;
+ bool checkMagic() const override;
public:
LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)
@@ -623,6 +626,11 @@
return (*SymOrErr)->st_size;
}
+template <class ELFT>
+bool ELFObjectFile<ELFT>::checkMagic() const {
+ return EF.getHeader().checkMagic();
+}
+
template <class ELFT>
uint64_t ELFObjectFile<ELFT>::getCommonSymbolSizeImpl(DataRefImpl Symb) const {
return getSymbolSize(Symb);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103546.349339.patch
Type: text/x-patch
Size: 2483 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210602/05726a7f/attachment.bin>
More information about the llvm-commits
mailing list