diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp index 55ef6669ee3..70cc4f01032 100644 --- a/lib/System/Unix/Path.cpp +++ b/lib/System/Unix/Path.cpp @@ -17,6 +17,7 @@ //===----------------------------------------------------------------------===// #include +#include #include "Unix.h" #include #include @@ -157,20 +158,29 @@ Path::getBasename() const { bool Path::hasMagicNumber(const std::string &Magic) const { size_t len = Magic.size(); - char buf[ 1 + len]; - std::ifstream f(path.c_str()); - f.read(buf, len); + assert(len < 1024 && "Request for magic string too long"); + char* buf = (char*) alloca(1 + len); + int fd = ::open(path.c_str(),O_RDONLY); + if (fd < 0) + return false; + if (0 != ::read(fd, buf, len)) + return false; + close(fd); buf[len] = '\0'; - f.close(); return Magic == buf; } bool Path::getMagicNumber(std::string& Magic, unsigned len) const { if (!isFile()) return false; - char buf[1 + len]; - std::ifstream f(path.c_str()); - f.read(buf,len); + assert(len < 1024 && "Request for magic string too long"); + char* buf = (char*) alloca(1 + len); + int fd = ::open(path.c_str(),O_RDONLY); + if (fd < 0) + return false; + if (0 != ::read(fd, buf, len)) + return false; + close(fd); buf[len] = '\0'; Magic = buf; return true; diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc index 55ef6669ee3..70cc4f01032 100644 --- a/lib/System/Unix/Path.inc +++ b/lib/System/Unix/Path.inc @@ -17,6 +17,7 @@ //===----------------------------------------------------------------------===// #include +#include #include "Unix.h" #include #include @@ -157,20 +158,29 @@ Path::getBasename() const { bool Path::hasMagicNumber(const std::string &Magic) const { size_t len = Magic.size(); - char buf[ 1 + len]; - std::ifstream f(path.c_str()); - f.read(buf, len); + assert(len < 1024 && "Request for magic string too long"); + char* buf = (char*) alloca(1 + len); + int fd = ::open(path.c_str(),O_RDONLY); + if (fd < 0) + return false; + if (0 != ::read(fd, buf, len)) + return false; + close(fd); buf[len] = '\0'; - f.close(); return Magic == buf; } bool Path::getMagicNumber(std::string& Magic, unsigned len) const { if (!isFile()) return false; - char buf[1 + len]; - std::ifstream f(path.c_str()); - f.read(buf,len); + assert(len < 1024 && "Request for magic string too long"); + char* buf = (char*) alloca(1 + len); + int fd = ::open(path.c_str(),O_RDONLY); + if (fd < 0) + return false; + if (0 != ::read(fd, buf, len)) + return false; + close(fd); buf[len] = '\0'; Magic = buf; return true;