Module: wine Branch: master Commit: d54e7cd51db7d3def7dab549a547b1b6bf7573e2 URL: https://gitlab.winehq.org/wine/wine/-/commit/d54e7cd51db7d3def7dab549a547b1b...
Author: Jinoh Kang jinoh.kang.kr@gmail.com Date: Sat May 13 00:36:29 2023 +0900
combase: Fix reading from beyond the end of a HGLOBAL stream.
---
dlls/combase/hglobalstream.c | 5 ++++- dlls/ole32/tests/hglobalstream.c | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/dlls/combase/hglobalstream.c b/dlls/combase/hglobalstream.c index 04eeeab7779..2f135bcbd74 100644 --- a/dlls/combase/hglobalstream.c +++ b/dlls/combase/hglobalstream.c @@ -151,7 +151,10 @@ static HRESULT WINAPI stream_Read(IStream *iface, void *pv, ULONG cb, ULONG *rea if (!read_len) read_len = &dummy;
- len = min(stream->handle->size - stream->position.u.LowPart, cb); + if (stream->handle->size >= stream->position.u.LowPart) + len = min(stream->handle->size - stream->position.u.LowPart, cb); + else + len = 0;
buffer = GlobalLock(stream->handle->hglobal); if (!buffer) diff --git a/dlls/ole32/tests/hglobalstream.c b/dlls/ole32/tests/hglobalstream.c index 8310800a5c7..889afa40174 100644 --- a/dlls/ole32/tests/hglobalstream.c +++ b/dlls/ole32/tests/hglobalstream.c @@ -65,6 +65,25 @@ static void test_streamonhglobal(void) hr = IStream_Write(pStream, data, sizeof(data), NULL); ok_ole_success(hr, "IStream_Write");
+ /* Seek beyond the end of the stream and read from it */ + ll.QuadPart = sizeof(data) + 16; + hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, NULL); + ok_ole_success(hr, "IStream_Seek"); + + hr = IStream_Read(pStream, buffer, sizeof(buffer), &read); + ok_ole_success(hr, "IStream_Read"); + ok(read == 0, "IStream_Read returned read %ld\n", read); + + ull.u.HighPart = 0xCAFECAFE; + ull.u.LowPart = 0xCAFECAFE; + ll.u.HighPart = 0; + ll.u.LowPart = 0; + hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); + ok_ole_success(hr, "IStream_Seek"); + ok(ull.u.LowPart == sizeof(data) + 16, "LowPart set to %ld\n", ull.u.LowPart); + ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %ld\n", ull.u.HighPart); + + /* Seek to the start of the stream and read from it */ ll.QuadPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, NULL); ok_ole_success(hr, "IStream_Seek");