diff options
-rw-r--r-- | include/configreader.h | 4 | ||||
-rw-r--r-- | src/configreader.cpp | 9 | ||||
-rw-r--r-- | src/inspircd.cpp | 3 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_gnutls.cpp | 8 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_openssl.cpp | 8 |
5 files changed, 21 insertions, 11 deletions
diff --git a/include/configreader.h b/include/configreader.h index aea355583..86191fa6d 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -681,6 +681,10 @@ class CoreExport ServerConfig : public Extensible */ bool ReadFile(file_cache &F, const char* fname); + /* Returns true if the given string starts with a windows drive letter + */ + bool StartsWithWindowsDriveLetter(const std::string &path); + /** Report a configuration error given in errormessage. * @param bail If this is set to true, the error is sent to the console, and the program exits * @param user If this is set to a non-null value, and bail is false, the errors are spooled to diff --git a/src/configreader.cpp b/src/configreader.cpp index 5b582b713..3f99a52e2 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -1649,6 +1649,11 @@ bool ServerConfig::DoPipe(ConfigDataHash &target, const std::string &file, std:: return ret; } +bool ServerConfig::StartsWithWindowsDriveLetter(const std::string &path) +{ + return (path.length() > 2 && isalpha(path[0]) && path[1] == ':'); +} + bool ServerConfig::DoInclude(ConfigDataHash &target, const std::string &file, std::ostringstream &errorstream) { std::string confpath; @@ -1661,7 +1666,7 @@ bool ServerConfig::DoInclude(ConfigDataHash &target, const std::string &file, st std::replace(newfile.begin(),newfile.end(),'\\','/'); std::replace(confpath.begin(),confpath.end(),'\\','/'); - if ((newfile[0] != '/') && (newfile.find("://") == std::string::npos)) + if ((newfile[0] != '/') && (!StartsWithWindowsDriveLetter(newfile))) { if((pos = confpath.rfind("/")) != std::string::npos) { @@ -1883,7 +1888,7 @@ bool ServerConfig::ReadFile(file_cache &F, const char* fname) F.clear(); - if ((*fname != '/') && (*fname != '\\')) + if ((*fname != '/') && (*fname != '\\') && (!StartsWithWindowsDriveLetter(fname))) { std::string::size_type pos; std::string confpath = ServerInstance->ConfigFileName; diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 97e2c77e3..50e76b2a2 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -351,7 +351,8 @@ bool InspIRCd::DaemonSeed() void InspIRCd::WritePID(const std::string &filename) { std::string fname = (filename.empty() ? "inspircd.pid" : filename); - if (*(fname.begin()) != '/') + std::replace(fname.begin(), fname.end(), '\\', '/'); + if ((fname[0] != '/') && (!Config->StartsWithWindowsDriveLetter(filename))) { std::string::size_type pos; std::string confpath = this->ConfigFileName; diff --git a/src/modules/extra/m_ssl_gnutls.cpp b/src/modules/extra/m_ssl_gnutls.cpp index 4b9d0fc4e..70c87d5fa 100644 --- a/src/modules/extra/m_ssl_gnutls.cpp +++ b/src/modules/extra/m_ssl_gnutls.cpp @@ -220,16 +220,16 @@ class ModuleSSLGnuTLS : public Module dh_bits = 1024; // Prepend relative paths with the path to the config directory. - if(cafile[0] != '/') + if ((cafile[0] != '/') && (!ServerInstance->Config->StartsWithWindowsDriveLetter(cafile))) cafile = confdir + cafile; - if(crlfile[0] != '/') + if ((crlfile[0] != '/') && (!ServerInstance->Config->StartsWithWindowsDriveLetter(crlfile))) crlfile = confdir + crlfile; - if(certfile[0] != '/') + if ((certfile[0] != '/') && (!ServerInstance->Config->StartsWithWindowsDriveLetter(certfile))) certfile = confdir + certfile; - if(keyfile[0] != '/') + if ((keyfile[0] != '/') && (!ServerInstance->Config->StartsWithWindowsDriveLetter(keyfile))) keyfile = confdir + keyfile; int ret; diff --git a/src/modules/extra/m_ssl_openssl.cpp b/src/modules/extra/m_ssl_openssl.cpp index 4691b874e..304e57989 100644 --- a/src/modules/extra/m_ssl_openssl.cpp +++ b/src/modules/extra/m_ssl_openssl.cpp @@ -244,16 +244,16 @@ class ModuleSSLOpenSSL : public Module dhfile = "dhparams.pem"; // Prepend relative paths with the path to the config directory. - if (cafile[0] != '/') + if ((cafile[0] != '/') && (!ServerInstance->Config->StartsWithWindowsDriveLetter(cafile))) cafile = confdir + cafile; - if (certfile[0] != '/') + if ((certfile[0] != '/') && (!ServerInstance->Config->StartsWithWindowsDriveLetter(certfile))) certfile = confdir + certfile; - if (keyfile[0] != '/') + if ((keyfile[0] != '/') && (!ServerInstance->Config->StartsWithWindowsDriveLetter(keyfile))) keyfile = confdir + keyfile; - if (dhfile[0] != '/') + if ((dhfile[0] != '/') && (!ServerInstance->Config->StartsWithWindowsDriveLetter(dhfile))) dhfile = confdir + dhfile; /* Load our keys and certificates |