Skip to content

Commit

Permalink
Fix detection of COFF executable files.
Browse files Browse the repository at this point in the history
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

llvm-svn: 327050
  • Loading branch information
Zachary Turner committed Mar 8, 2018
1 parent b575f46 commit 9899b5f
Showing 1 changed file with 6 additions and 8 deletions.
14 changes: 6 additions & 8 deletions llvm/lib/BinaryFormat/Magic.cpp
Expand Up @@ -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 <unistd.h>
Expand Down Expand Up @@ -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<MemoryBuffer> FileBuffer = std::move(*FileOrError);
Result = identify_magic(FileBuffer->getBuffer());

Result = identify_magic(StringRef(Buffer, Length));
return std::error_code();
}

0 comments on commit 9899b5f

Please sign in to comment.