From 45fc75457b56bb14ad0f7b99909b96404df69c8c Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Sat, 26 Aug 2017 17:25:20 +0100 Subject: Use DLLManager::RetrieveLastError() on all platforms. This prevents a bug where we send malformed messages to the client when dlerror() returns an error message containing more than one line. This has been observed on macOS but probably will happen on other UNIX systems too. This also fixes a potential problem where dlerror() returns NULL and converting it to std::string causes a crash. I can't see any way that this might happen but it is better to be safe than sorry. --- src/dynamic.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) (limited to 'src/dynamic.cpp') diff --git a/src/dynamic.cpp b/src/dynamic.cpp index 3a6a151cb..25178cfa1 100644 --- a/src/dynamic.cpp +++ b/src/dynamic.cpp @@ -43,11 +43,7 @@ DLLManager::DLLManager(const char *fname) h = dlopen(fname, RTLD_NOW|RTLD_LOCAL); if (!h) { -#ifdef _WIN32 RetrieveLastError(); -#else - err = dlerror(); -#endif } } @@ -72,11 +68,7 @@ Module* DLLManager::CallInit() initfn.vptr = dlsym(h, MODULE_INIT_STR); if (!initfn.vptr) { -#ifdef _WIN32 RetrieveLastError(); -#else - err = dlerror(); -#endif return NULL; } @@ -94,18 +86,21 @@ std::string DLLManager::GetVersion() return "Unversioned module"; } -#ifdef _WIN32 void DLLManager::RetrieveLastError() { +#if defined _WIN32 char errmsg[500]; DWORD dwErrorCode = GetLastError(); if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)errmsg, _countof(errmsg), NULL) == 0) sprintf_s(errmsg, _countof(errmsg), "Error code: %u", dwErrorCode); SetLastError(ERROR_SUCCESS); err = errmsg; +#else + char* errmsg = dlerror(); + err = errmsg ? errmsg : "Unknown error"; +#endif std::string::size_type p; while ((p = err.find_last_of("\r\n")) != std::string::npos) err.erase(p, 1); } -#endif -- cgit v1.2.3