From 074a96c9ffc85763da833bccadefc9978152482c Mon Sep 17 00:00:00 2001 From: attilamolnar Date: Mon, 9 Jul 2012 18:06:08 +0200 Subject: Close files opened with popen() with pclose() instead of fclose() --- include/configparser.h | 10 ++++++++-- src/configparser.cpp | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/include/configparser.h b/include/configparser.h index 478899ed9..4b83d26d7 100644 --- a/include/configparser.h +++ b/include/configparser.h @@ -61,13 +61,19 @@ struct ParseStack struct FileWrapper { FILE* const f; - FileWrapper(FILE* file) : f(file) {} + bool close_with_pclose; + FileWrapper(FILE* file, bool use_pclose = false) : f(file), close_with_pclose(use_pclose) {} operator bool() { return f; } operator FILE*() { return f; } ~FileWrapper() { if (f) - fclose(f); + { + if (close_with_pclose) + pclose(f); + else + fclose(f); + } } }; diff --git a/src/configparser.cpp b/src/configparser.cpp index a8e36f6e0..b6e3f7187 100644 --- a/src/configparser.cpp +++ b/src/configparser.cpp @@ -307,7 +307,7 @@ void ParseStack::DoReadFile(const std::string& key, const std::string& name, int if (exec && (flags & FLAG_NO_EXEC)) throw CoreException("Invalid tag in file included with noexec=\"yes\""); - FileWrapper file(exec ? popen(name.c_str(), "r") : fopen(name.c_str(), "r")); + FileWrapper file(exec ? popen(name.c_str(), "r") : fopen(name.c_str(), "r"), exec); if (!file) throw CoreException("Could not read \"" + name + "\" for \"" + key + "\" file"); @@ -364,7 +364,7 @@ bool ParseStack::ParseExec(const std::string& name, int flags) /* It's not already included, add it to the list of files we've loaded */ - FileWrapper file(popen(name.c_str(), "r")); + FileWrapper file(popen(name.c_str(), "r"), true); if (!file) throw CoreException("Could not open executable \"" + name + "\" for include"); -- cgit v1.2.3