From 2ad59db75f65c5523a9e05b886edfba267c6336c Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Tue, 8 Dec 2015 18:43:00 -0800 Subject: [PATCH] libbacktrace: check if elf file paths are valid before reading them. Bug: 25194400 Change-Id: If6e60585673226392d38fab9ad14bd7b94261316 --- libbacktrace/BacktraceOffline.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/libbacktrace/BacktraceOffline.cpp b/libbacktrace/BacktraceOffline.cpp index 27dfb8313..abc186b25 100644 --- a/libbacktrace/BacktraceOffline.cpp +++ b/libbacktrace/BacktraceOffline.cpp @@ -22,7 +22,9 @@ extern "C" { } #include +#include #include +#include #include #include #include @@ -616,7 +618,30 @@ DebugFrameInfo* ReadDebugFrameFromELFFile(const llvm::object::ELFFile* 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;