From 49bb1358d88017ddb1e1a30b0df866f6f9bde3de Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sat, 28 Jan 2023 22:38:34 -0800 Subject: [PATCH] [wpiutil] MemoryBuffer: Fix GetMemoryBufferForStream (#5017) This would previously just write past the end of the buffer, smashing the stack. It's only called in the case when a non-file or block device is used as the file. --- .../native/thirdparty/llvm/cpp/llvm/MemoryBuffer.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/wpiutil/src/main/native/thirdparty/llvm/cpp/llvm/MemoryBuffer.cpp b/wpiutil/src/main/native/thirdparty/llvm/cpp/llvm/MemoryBuffer.cpp index 5beeb383fc..72cdf09882 100644 --- a/wpiutil/src/main/native/thirdparty/llvm/cpp/llvm/MemoryBuffer.cpp +++ b/wpiutil/src/main/native/thirdparty/llvm/cpp/llvm/MemoryBuffer.cpp @@ -237,14 +237,17 @@ static std::unique_ptr GetMemoryBufferForStream( #endif // Read into Buffer until we hit EOF. do { - buffer.resize_for_overwrite(buffer.size() + ChunkSize); + size_t prevSize = buffer.size(); + buffer.resize_for_overwrite(prevSize + ChunkSize); #ifdef _WIN32 - if (!ReadFile(f, buffer.end(), ChunkSize, &readBytes, nullptr)) { + if (!ReadFile(f, buffer.begin() + prevSize, ChunkSize, &readBytes, + nullptr)) { ec = mapWindowsError(GetLastError()); return nullptr; } #else - readBytes = sys::RetryAfterSignal(-1, ::read, f, buffer.end(), ChunkSize); + readBytes = sys::RetryAfterSignal(-1, ::read, f, buffer.begin() + prevSize, + ChunkSize); if (readBytes == -1) { ec = std::error_code(errno, std::generic_category()); return nullptr;