Jeff Zaroyko : dsound: Check for invalid parameter when unlocking secondary buffers.

Alexandre Julliard julliard at winehq.org
Fri Sep 5 06:58:03 CDT 2008


Module: wine
Branch: master
Commit: e55a702928b9efb9f51ed7817dc76d41e53fc9fa
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e55a702928b9efb9f51ed7817dc76d41e53fc9fa

Author: Jeff Zaroyko <jeffz at jeffz.name>
Date:   Wed Sep  3 07:08:21 2008 +1000

dsound: Check for invalid parameter when unlocking secondary buffers.

---

 dlls/dsound/buffer.c     |    7 ++++++-
 dlls/dsound/tests/ds3d.c |    3 +++
 2 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c
index 480e8a1..6659a47 100644
--- a/dlls/dsound/buffer.c
+++ b/dlls/dsound/buffer.c
@@ -735,7 +735,12 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Unlock(
 		{
 			RtlAcquireResourceShared(&iter->lock, TRUE);
 			if (x1)
-				DSOUND_MixToTemporary(iter, (DWORD_PTR)p1 - (DWORD_PTR)iter->buffer->memory, x1, FALSE);
+                        {
+			    if(x1 + (DWORD_PTR)p1 - (DWORD_PTR)iter->buffer->memory > iter->buflen)
+			      hres = DSERR_INVALIDPARAM;
+			    else
+			      DSOUND_MixToTemporary(iter, (DWORD_PTR)p1 - (DWORD_PTR)iter->buffer->memory, x1, FALSE);
+                        }
 			if (x2)
 				DSOUND_MixToTemporary(iter, 0, x2, FALSE);
 			RtlReleaseResource(&iter->lock);
diff --git a/dlls/dsound/tests/ds3d.c b/dlls/dsound/tests/ds3d.c
index de3e38c..c3fa0ed 100644
--- a/dlls/dsound/tests/ds3d.c
+++ b/dlls/dsound/tests/ds3d.c
@@ -197,6 +197,9 @@ static int buffer_refill(play_state_t* state, DWORD size)
         state->written+=len2;
     }
     state->offset=state->written % state->buffer_size;
+    /* some apps blindly pass &ptr1 instead of ptr1 */
+    rc=IDirectSoundBuffer_Unlock(state->dsbo,&ptr1,len1,ptr2,len2);
+    ok(rc==DSERR_INVALIDPARAM, "IDDirectSoundBuffer_Unlock(): expected %08x got %08x, %p %p\n",DSERR_INVALIDPARAM, rc, &ptr1, ptr1);
     rc=IDirectSoundBuffer_Unlock(state->dsbo,ptr1,len1,ptr2,len2);
     ok(rc==DS_OK,"IDirectSoundBuffer_Unlock() failed: %08x\n", rc);
     if (rc!=DS_OK)




More information about the wine-cvs mailing list