Jörg Höhle : dsound: Correct deallocations when DuplicateSoundBuffer fails.

Alexandre Julliard julliard at winehq.org
Tue Oct 6 10:35:52 CDT 2009


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

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Sun Oct  4 09:13:53 2009 +0200

dsound: Correct deallocations when DuplicateSoundBuffer fails.

---

 dlls/dsound/buffer.c |   26 ++++++++++++--------------
 1 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c
index 4b486fd..2a25d50 100644
--- a/dlls/dsound/buffer.c
+++ b/dlls/dsound/buffer.c
@@ -1177,15 +1177,20 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
     HRESULT hres = DS_OK;
     TRACE("(%p,%p,%p)\n", device, pdsb, pdsb);
 
-    dsb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*dsb));
-
+    dsb = HeapAlloc(GetProcessHeap(),0,sizeof(*dsb));
     if (dsb == NULL) {
         WARN("out of memory\n");
         *ppdsb = NULL;
         return DSERR_OUTOFMEMORY;
     }
+    CopyMemory(dsb, pdsb, sizeof(*dsb));
 
-    CopyMemory(dsb, pdsb, sizeof(IDirectSoundBufferImpl));
+    dsb->pwfx = DSOUND_CopyFormat(pdsb->pwfx);
+    if (dsb->pwfx == NULL) {
+        HeapFree(GetProcessHeap(),0,dsb);
+        *ppdsb = NULL;
+        return DSERR_OUTOFMEMORY;
+    }
 
     if (pdsb->hwbuf) {
         TRACE("duplicating hardware buffer\n");
@@ -1194,6 +1199,7 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
                                               (LPVOID *)&dsb->hwbuf);
         if (FAILED(hres)) {
             WARN("IDsDriver_DuplicateSoundBuffer failed (%08x)\n", hres);
+            HeapFree(GetProcessHeap(),0,dsb->pwfx);
             HeapFree(GetProcessHeap(),0,dsb);
             *ppdsb = NULL;
             return hres;
@@ -1213,15 +1219,6 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
     DSOUND_RecalcFormat(dsb);
     DSOUND_MixToTemporary(dsb, 0, dsb->buflen, FALSE);
 
-    dsb->pwfx = DSOUND_CopyFormat(pdsb->pwfx);
-    if (dsb->pwfx == NULL) {
-        HeapFree(GetProcessHeap(),0,dsb->tmp_buffer);
-        HeapFree(GetProcessHeap(),0,dsb->buffer);
-        HeapFree(GetProcessHeap(),0,dsb);
-        *ppdsb = NULL;
-        return DSERR_OUTOFMEMORY;
-    }
-
     RtlInitializeResource(&dsb->lock);
 
     /* register buffer */
@@ -1229,10 +1226,11 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
     if (hres != DS_OK) {
         RtlDeleteResource(&dsb->lock);
         HeapFree(GetProcessHeap(),0,dsb->tmp_buffer);
-        HeapFree(GetProcessHeap(),0,dsb->buffer);
+        list_remove(&dsb->entry);
+        dsb->buffer->ref--;
         HeapFree(GetProcessHeap(),0,dsb->pwfx);
         HeapFree(GetProcessHeap(),0,dsb);
-        *ppdsb = 0;
+        dsb = NULL;
     }
 
     *ppdsb = dsb;




More information about the wine-cvs mailing list