[DSOUND] Fix buffermemleak if usesystemmemory and use_hw was set

Peter Berg Larsen pebl at math.ku.dk
Sat Nov 5 04:50:45 CST 2005


Changelog:
 	if USESYSTEMMEMORY and use_hw are set, then dsb->buffer->memory is
         leaked.



Index: dlls/dsound/buffer.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/buffer.c,v
retrieving revision 1.55
diff -u -r1.55 buffer.c
--- dlls/dsound/buffer.c	19 Oct 2005 19:21:38 -0000	1.55
+++ dlls/dsound/buffer.c	5 Nov 2005 10:24:29 -0000
@@ -1074,45 +1074,32 @@
  		return DSERR_OUTOFMEMORY;
  	}

+	/* Allocate the hardware buffer */
+	if (use_hw && !(ds->device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY)) {
+		err = IDsDriver_CreateSoundBuffer(ds->device->driver,wfex,dsbd->dwFlags,0,
+						  &(dsb->buflen),&(dsb->buffer->memory),
+						  (LPVOID*)&(dsb->hwbuf));
+                /* fall back to software buffer on failure */
+		if (err != DS_OK) {
+			TRACE("IDsDriver_CreateSoundBuffer failed, falling back to software buffer\n");
+			use_hw = 0;
+		}
+	}
+
  	/* Allocate system memory for buffer if applicable */
-	if ((ds->device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY) || !use_hw) {
+	if (!(use_hw && !(ds->device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY))) {
  		dsb->buffer->memory = HeapAlloc(GetProcessHeap(),0,dsb->buflen);
  		if (dsb->buffer->memory == NULL) {
  			WARN("out of memory\n");
-			HeapFree(GetProcessHeap(),0,dsb->pwfx);
  			HeapFree(GetProcessHeap(),0,dsb->buffer);
+			HeapFree(GetProcessHeap(),0,dsb->pwfx);
  			HeapFree(GetProcessHeap(),0,dsb);
  			*pdsb = NULL;
  			return DSERR_OUTOFMEMORY;
  		}
  		dsb->buffer->ref = 1;
  		FillMemory(dsb->buffer->memory, dsb->buflen, dsbd->lpwfxFormat->wBitsPerSample == 8 ? 128 : 0);
-	}
-
-	/* Allocate the hardware buffer */
-	if (use_hw) {
-		err = IDsDriver_CreateSoundBuffer(ds->device->driver,wfex,dsbd->dwFlags,0,
-						  &(dsb->buflen),&(dsb->buffer->memory),
-						  (LPVOID*)&(dsb->hwbuf));
-                /* fall back to software buffer on failure */
-		if (err != DS_OK) {
-			TRACE("IDsDriver_CreateSoundBuffer failed, falling back to software buffer\n");
-			use_hw = 0;
-			if (ds->device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY) {
-				dsb->buffer->memory = HeapAlloc(GetProcessHeap(),0,dsb->buflen);
-				if (dsb->buffer->memory == NULL) {
-					WARN("out of memory\n");
-					HeapFree(GetProcessHeap(),0,dsb->buffer);
-					HeapFree(GetProcessHeap(),0,dsb->pwfx);
-					HeapFree(GetProcessHeap(),0,dsb);
-					*pdsb = NULL;
-					return DSERR_OUTOFMEMORY;
-				}
-				dsb->buffer->ref = 1;
-				FillMemory(dsb->buffer->memory, dsb->buflen, dsbd->lpwfxFormat->wBitsPerSample == 8 ? 128 : 0);
-			}
-			err = DS_OK;
-		}
+		err = DS_OK;
  	}

  	/* calculate fragment size and write lead */




More information about the wine-patches mailing list