RFC: winealsa.drv: fix memory leak (found by Smatch)
Lionel_Debroux
lionel_debroux at yahoo.fr
Fri Aug 31 07:49:38 CDT 2007
modLongData leaks some heap memory in three error paths. Found in
Michael Stefaniuc's list of Wine potential bugs detected by Smatch.
While looking at the function, I noticed
if (lpNewData)
HeapFree(GetProcessHeap(), 0, lpData);
at lines 1015-1016.
I think "lpData" should be "lpNewData", because this function allocates
"lpNewData", not "lpData" which is passed to the function through a
LPMIDIHDR structure.
So I added a FIXME, and I am asking for comments/corrections :-)
2007-08-31 Lionel Debroux <lionel_debroux at yahoo.fr>
* dlls/winealsa.drv/midi.c:
winealsa.drv: fix memory leak (found by Smatch)
-------------- next part --------------
>From e148279419c180bd3db1b8b1a61f737bd92c73be Mon Sep 17 00:00:00 2001
From: Lionel Debroux <lionel_debroux at yahoo.fr>
Date: Fri, 31 Aug 2007 14:33:40 +0200
Subject: winealsa.drv: fix memory leak (found by Smatch).
---
dlls/winealsa.drv/midi.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/dlls/winealsa.drv/midi.c b/dlls/winealsa.drv/midi.c
index f5e98ed..2cf9287 100644
--- a/dlls/winealsa.drv/midi.c
+++ b/dlls/winealsa.drv/midi.c
@@ -1013,20 +1013,26 @@ static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
snd_seq_ev_set_sysex(&event, lpMidiHdr->dwBufferLength + len_add, lpNewData ? lpNewData : lpData);
snd_seq_event_output_direct(midiSeq, &event);
if (lpNewData)
- HeapFree(GetProcessHeap(), 0, lpData);
+ HeapFree(GetProcessHeap(), 0, lpData); /* FIXME: lpNewData instead of lpData ? */
break;
default:
WARN("Technology not supported (yet) %d !\n",
MidiOutDev[wDevID].caps.wTechnology);
- return MMSYSERR_NOTENABLED;
+ if (lpNewData)
+ HeapFree(GetProcessHeap(), 0, lpNewData);
+ return MMSYSERR_NOTENABLED;
}
lpMidiHdr->dwFlags &= ~MHDR_INQUEUE;
lpMidiHdr->dwFlags |= MHDR_DONE;
if (MIDI_NotifyClient(wDevID, MOM_DONE, (DWORD)lpMidiHdr, 0L) != MMSYSERR_NOERROR) {
WARN("can't notify client !\n");
- return MMSYSERR_INVALPARAM;
+ if (lpNewData)
+ HeapFree(GetProcessHeap(), 0, lpNewData);
+ return MMSYSERR_INVALPARAM;
}
+ if (lpNewData)
+ HeapFree(GetProcessHeap(), 0, lpNewData);
return MMSYSERR_NOERROR;
}
--
1.4.4.4
More information about the wine-patches
mailing list