Merge "libbacktrace: check if elf file paths are valid before reading them."

am: b6345d6efa

* commit 'b6345d6efa7f9026a7a3414a1dd91535d063ce93':
  libbacktrace: check if elf file paths are valid before reading them.
This commit is contained in:
Yabin Cui 2015-12-09 18:33:12 +00:00 committed by android-build-merger
commit e6bcd22f3e
1 changed files with 25 additions and 0 deletions

View File

@ -22,7 +22,9 @@ extern "C" {
}
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <ucontext.h>
#include <unistd.h>
@ -616,7 +618,30 @@ DebugFrameInfo* ReadDebugFrameFromELFFile(const llvm::object::ELFFile<ELFT>* elf
return debug_frame;
}
static bool IsValidElfPath(const std::string& filename) {
static const char elf_magic[] = {0x7f, 'E', 'L', 'F'};
struct stat st;
if (stat(filename.c_str(), &st) != 0 || !S_ISREG(st.st_mode)) {
return false;
}
FILE* fp = fopen(filename.c_str(), "reb");
if (fp == nullptr) {
return false;
}
char buf[4];
if (fread(buf, 4, 1, fp) != 1) {
fclose(fp);
return false;
}
fclose(fp);
return memcmp(buf, elf_magic, 4) == 0;
}
static DebugFrameInfo* ReadDebugFrameFromFile(const std::string& filename) {
if (!IsValidElfPath(filename)) {
return nullptr;
}
auto owning_binary = llvm::object::createBinary(llvm::StringRef(filename));
if (owning_binary.getError()) {
return nullptr;