[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