[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