[DSOUND] fix memory leak in mixer code

Robert Reif reif at earthlink.net
Sat Jan 22 14:55:16 CST 2005


Robert Reif wrote:

> Fix memory leak in mixer code.
>
>  
>
Revised to remove unnecessary test before HeapFree.
-------------- next part --------------
Index: dlls/dsound/dsound.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound.c,v
retrieving revision 1.24
diff -u -p -r1.24 dsound.c
--- dlls/dsound/dsound.c	7 Dec 2004 14:23:46 -0000	1.24
+++ dlls/dsound/dsound.c	22 Jan 2005 20:52:27 -0000
@@ -301,6 +301,7 @@ static ULONG WINAPI IDirectSoundImpl_Rel
         if (This->driver)
             IDsDriver_Release(This->driver);
 
+	HeapFree(GetProcessHeap(),0,This->tmp_buffer);
         RtlDeleteResource(&This->buffer_list_lock);
         This->mixlock.DebugInfo->Spare[1] = 0;
         DeleteCriticalSection(&This->mixlock);
@@ -809,6 +810,8 @@ HRESULT WINAPI IDirectSoundImpl_Create(
     pDS->primary        = NULL;
     pDS->speaker_config = DSSPEAKER_STEREO | (DSSPEAKER_GEOMETRY_NARROW << 16);
     pDS->initialized    = FALSE;
+    pDS->tmp_buffer     = NULL;
+    pDS->tmp_buffer_len = 0;
 
     /* 3D listener initial parameters */
     pDS->listener       = NULL;
Index: dlls/dsound/dsound_private.h
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound_private.h,v
retrieving revision 1.24
diff -u -p -r1.24 dsound_private.h
--- dlls/dsound/dsound_private.h	7 Sep 2004 19:32:21 -0000	1.24
+++ dlls/dsound/dsound_private.h	22 Jan 2005 20:52:27 -0000
@@ -95,6 +95,8 @@ struct IDirectSoundImpl
     DSBUFFERDESC                dsbd;
     DWORD                       speaker_config;
     BOOL                        initialized;
+    LPBYTE                      tmp_buffer;
+    DWORD                       tmp_buffer_len;
 
     /* DirectSound3DListener fields */
     IDirectSound3DListenerImpl*	listener;
Index: dlls/dsound/mixer.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/mixer.c,v
retrieving revision 1.26
diff -u -p -r1.26 mixer.c
--- dlls/dsound/mixer.c	8 Sep 2004 01:37:25 -0000	1.26
+++ dlls/dsound/mixer.c	22 Jan 2005 20:52:27 -0000
@@ -368,20 +368,20 @@ static void DSOUND_MixerVol(IDirectSound
 	}
 }
 
-static void *tmp_buffer;
-static size_t tmp_buffer_len = 0;
-
-static void *DSOUND_tmpbuffer(size_t len)
+static LPBYTE DSOUND_tmpbuffer(IDirectSoundImpl *dsound, DWORD len)
 {
-  if (len>tmp_buffer_len) {
-    void *new_buffer = realloc(tmp_buffer, len);
-    if (new_buffer) {
-      tmp_buffer = new_buffer;
-      tmp_buffer_len = len;
+    TRACE("(%p,%ld)\n",dsound,len);
+
+    if (len > dsound->tmp_buffer_len) {
+        if (dsound->tmp_buffer)
+            dsound->tmp_buffer = HeapReAlloc(GetProcessHeap(), 0, dsound->tmp_buffer, len);
+        else
+            dsound->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, len);
+
+        dsound->tmp_buffer_len = len;
     }
-    return new_buffer;
-  }
-  return tmp_buffer;
+
+    return dsound->tmp_buffer;
 }
 
 static DWORD DSOUND_MixInBuffer(IDirectSoundBufferImpl *dsb, DWORD writepos, DWORD fraglen)
@@ -407,9 +407,7 @@ static DWORD DSOUND_MixInBuffer(IDirectS
 		return 0;
 	}
 
-	/* Been seeing segfaults in malloc() for some reason... */
-	TRACE("allocating buffer (size = %d)\n", len);
-	if ((buf = ibuf = (BYTE *) DSOUND_tmpbuffer(len)) == NULL)
+	if ((buf = ibuf = DSOUND_tmpbuffer(dsb->dsound, len)) == NULL)
 		return 0;
 
 	TRACE("MixInBuffer (%p) len = %d, dest = %ld\n", dsb, len, writepos);
@@ -518,8 +516,7 @@ static void DSOUND_PhaseCancel(IDirectSo
 	nBlockAlign = dsb->dsound->pwfx->nBlockAlign;
 	len = len / nBlockAlign * nBlockAlign;  /* data alignment */
 
-	TRACE("allocating buffer (size = %ld)\n", len);
-	if ((buf = ibuf = (BYTE *) DSOUND_tmpbuffer(len)) == NULL)
+	if ((buf = ibuf = DSOUND_tmpbuffer(dsb->dsound, len)) == NULL)
 		return;
 
 	TRACE("PhaseCancel (%p) len = %ld, dest = %ld\n", dsb, len, writepos);


More information about the wine-devel mailing list