From cd46ecad1910fae22c93f02b108e70c4e0a2a8ea Mon Sep 17 00:00:00 2001 From: "William R. Dieter" Date: Fri, 25 Aug 2023 23:00:08 -0700 Subject: Debugger: Fix pipe connection error message construction on Windows Adding an integer to a C string does pointer math, rather than converting to string. Instead convert the result of `GetLastError` to string before adding it to the error message. This problem was accidentally introduced by commit 8b1257e7bf (Debugger: Replace libuv with platform-specific connection code, 2023-07-29). Signed-off-by: William R. Dieter --- Source/cmDebuggerWindowsPipeConnection.cxx | 17 ++++++++++++++++- Source/cmDebuggerWindowsPipeConnection.h | 2 ++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Source/cmDebuggerWindowsPipeConnection.cxx b/Source/cmDebuggerWindowsPipeConnection.cxx index 1c6a2a7..5f6f848 100644 --- a/Source/cmDebuggerWindowsPipeConnection.cxx +++ b/Source/cmDebuggerWindowsPipeConnection.cxx @@ -221,13 +221,28 @@ void cmDebuggerPipeClient_WIN32::WaitForConnection() NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hPipe == INVALID_HANDLE_VALUE) { auto err = GetLastError(); - throw std::runtime_error("CreateFile failed with " + err); + throw std::runtime_error(std::string("CreateFile failed for pipe ") + + GetErrorMessage(err)); } pipes = std::make_unique(hPipe); } } +std::string cmDebuggerPipeClient_WIN32::GetErrorMessage(DWORD errorCode) +{ + LPSTR message = nullptr; + DWORD size = FormatMessageA( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)&message, 0, nullptr); + std::string errorMessage = + this->PipeName + ": " + std::string(message, size); + LocalFree(message); + return errorMessage; +} + bool cmDebuggerPipeClient_WIN32::isOpen() { return pipes != nullptr; diff --git a/Source/cmDebuggerWindowsPipeConnection.h b/Source/cmDebuggerWindowsPipeConnection.h index 88ed1de..6a57435 100644 --- a/Source/cmDebuggerWindowsPipeConnection.h +++ b/Source/cmDebuggerWindowsPipeConnection.h @@ -90,6 +90,8 @@ public: bool write(void const* buffer, size_t n) override; private: + std::string GetErrorMessage(DWORD errorCode); + std::string const PipeName; std::unique_ptr pipes; }; -- cgit v0.12