From 4b32c56fb3b9ee4a3a775d7cd7d8bfbc7d224516 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Thu, 8 Mar 2018 19:45:20 +0000 Subject: [PATCH] Fix detection of COFF executable files. One overload of this function would try to identify a file by opening it and using the first 32 bytes to identify the magic of the file. This didn't work properly when more than 32 bytes is actually needed for magic detection to succeed. So now we have this overload read in the entire file. Differential Revision: https://reviews.llvm.org/D44225 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327050 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/BinaryFormat/Magic.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/BinaryFormat/Magic.cpp b/lib/BinaryFormat/Magic.cpp index 22ea2280433..afc217c6a51 100644 --- a/lib/BinaryFormat/Magic.cpp +++ b/lib/BinaryFormat/Magic.cpp @@ -14,6 +14,7 @@ #include "llvm/BinaryFormat/MachO.h" #include "llvm/Support/Endian.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/MemoryBuffer.h" #if !defined(_MSC_VER) && !defined(__MINGW32__) #include @@ -205,15 +206,12 @@ file_magic llvm::identify_magic(StringRef Magic) { } std::error_code llvm::identify_magic(const Twine &Path, file_magic &Result) { - int FD; - if (std::error_code EC = openFileForRead(Path, FD)) - return EC; + auto FileOrError = MemoryBuffer::getFile(Path); + if (!FileOrError) + return FileOrError.getError(); - char Buffer[32]; - int Length = read(FD, Buffer, sizeof(Buffer)); - if (close(FD) != 0 || Length < 0) - return std::error_code(errno, std::generic_category()); + std::unique_ptr FileBuffer = std::move(*FileOrError); + Result = identify_magic(FileBuffer->getBuffer()); - Result = identify_magic(StringRef(Buffer, Length)); return std::error_code(); }