Module: wine Branch: master Commit: 1941a915368b8898da21d0dd4157fd68a4f4c9dd URL: https://gitlab.winehq.org/wine/wine/-/commit/1941a915368b8898da21d0dd4157fd6...
Author: Yuxuan Shui yshui@codeweavers.com Date: Thu Dec 7 19:55:20 2023 +0000
dsound: Set position past the end of the buffer is invalid.
---
dlls/dsound/buffer.c | 7 +++++-- dlls/dsound/tests/dsound.c | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 1b724ee775b..8e261fde32c 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -574,12 +574,15 @@ static HRESULT WINAPI IDirectSoundBufferImpl_SetCurrentPosition(IDirectSoundBuff IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer8(iface); HRESULT hres = DS_OK;
- TRACE("(%p,%ld)\n",This,newpos); + TRACE("(%p,%lu)\n",This,newpos); + + if (newpos >= This->buflen) { + return E_INVALIDARG; + }
AcquireSRWLockExclusive(&This->lock);
/* start mixing from this new location instead */ - newpos %= This->buflen; newpos -= newpos%This->pwfx->nBlockAlign; This->sec_mixpos = newpos;
diff --git a/dlls/dsound/tests/dsound.c b/dlls/dsound/tests/dsound.c index d5a3ccad8fd..9656a458415 100644 --- a/dlls/dsound/tests/dsound.c +++ b/dlls/dsound/tests/dsound.c @@ -919,6 +919,13 @@ static HRESULT test_block_align(LPGUID lpGuid) rc = IDirectSoundBuffer_GetCurrentPosition(secondary, &pos2, NULL); ok(rc == DS_OK, "Could not get new position: %08lx\n", rc); ok(pos == pos2, "Positions not the same! Old position: %ld, new position: %ld\n", pos, pos2); + + /* Set position to past the end of the buffer */ + rc = IDirectSoundBuffer_SetCurrentPosition(secondary, wfx.nAvgBytesPerSec + 100); + ok(rc == E_INVALIDARG, "Set position to %lu succeeded\n", wfx.nAvgBytesPerSec + 100); + rc = IDirectSoundBuffer_GetCurrentPosition(secondary, &pos2, NULL); + ok(rc == DS_OK, "Could not get new position: %08lx\n", rc); + ok(pos == pos2, "Positions not the same! Old position: %ld, new position: %ld\n", pos, pos2); } ref=IDirectSoundBuffer_Release(secondary); ok(ref==0,"IDirectSoundBuffer_Release() secondary has %d references, "