Fix buffer overflow.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 19 Oct 2017 01:25:48 +0000 (01:25 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 19 Oct 2017 01:25:48 +0000 (01:25 +0000)
We were reading past the end of the buffer.

llvm-svn: 316143

llvm/lib/BinaryFormat/Magic.cpp
llvm/test/Object/Inputs/invalid-coff-header-too-small [new file with mode: 0644]
llvm/test/Object/invalid.test

index e9b8df9..db8e952 100644 (file)
@@ -185,7 +185,7 @@ file_magic llvm::identify_magic(StringRef Magic) {
     if (startswith(Magic, "MZ") && Magic.size() >= 0x3c + 4) {
       uint32_t off = read32le(Magic.data() + 0x3c);
       // PE/COFF file, either EXE or DLL.
-      if (off < Magic.size() &&
+      if (off + sizeof(COFF::PEMagic) <= Magic.size() &&
           memcmp(Magic.data() + off, COFF::PEMagic, sizeof(COFF::PEMagic)) == 0)
         return file_magic::pecoff_executable;
     }
diff --git a/llvm/test/Object/Inputs/invalid-coff-header-too-small b/llvm/test/Object/Inputs/invalid-coff-header-too-small
new file mode 100644 (file)
index 0000000..c9f0c96
Binary files /dev/null and b/llvm/test/Object/Inputs/invalid-coff-header-too-small differ
index b0b5528..6899f5a 100644 (file)
@@ -86,3 +86,6 @@ INVALID-REL-SYM: invalid section offset
 
 RUN: not llvm-readobj -r %p/Inputs/invalid-buffer.elf 2>&1 | FileCheck --check-prefix=INVALID-BUFFER %s
 INVALID-BUFFER: Invalid buffer
+
+RUN: not llvm-readobj %p/Inputs/invalid-coff-header-too-small 2>&1 | FileCheck --check-prefix=COFF-HEADER %s
+COFF-HEADER: The file was not recognized as a valid object file