diff --git a/util/expressions.cpp b/util/expressions.cpp index a81e0cd5..b33f8972 100644 --- a/util/expressions.cpp +++ b/util/expressions.cpp @@ -42,6 +42,7 @@ #include #if !defined(_WIN32) #include +#include #include #else // Windows support is probably very fragile @@ -145,8 +146,9 @@ bool isIgnorable(const std::string &f) { #ifndef _WIN32 void loadExpressions(const string &inPath, ExpressionMap &exprMap) { // Is our input path a file or a directory? + int fd = open(inPath.c_str(), O_RDONLY); struct stat st; - if (stat(inPath.c_str(), &st) != 0) { + if (fstat(fd, &st) != 0) { cerr << "Can't stat path: '" << inPath << "'" << endl; exit(1); } @@ -159,7 +161,7 @@ void loadExpressions(const string &inPath, ExpressionMap &exprMap) { exit(1); } } else if (S_ISDIR(st.st_mode)) { - DIR *d = opendir(inPath.c_str()); + DIR *d = fdopendir(fd); if (d == nullptr) { cerr << "Can't open directory: '" << inPath << "'" << endl; exit(1); @@ -188,11 +190,12 @@ void loadExpressions(const string &inPath, ExpressionMap &exprMap) { exit(1); } } - closedir(d); + (void)closedir(d); } else { cerr << "Can't stat path: '" << inPath << "'" << endl; exit(1); } + (void)close(fd); } #else // windows TODO: improve void HS_CDECL loadExpressions(const string &inPath, ExpressionMap &exprMap) {