Michael Stefaniuc : dmusic: Don' t leak memory on DirectMusicInstrument creation failure.

Alexandre Julliard julliard at winehq.org
Wed Jun 11 13:36:23 CDT 2014


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

Author: Michael Stefaniuc <mstefani at redhat.de>
Date:   Sat May 31 19:22:48 2014 +0200

dmusic: Don't leak memory on DirectMusicInstrument creation failure.

Also lock/unlock the module only on creation/destruction of the object.

---

 dlls/dmusic/instrument.c |   19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c
index 9df3e0c..87b31c1 100644
--- a/dlls/dmusic/instrument.c
+++ b/dlls/dmusic/instrument.c
@@ -62,8 +62,6 @@ static ULONG WINAPI IDirectMusicInstrumentImpl_AddRef(LPDIRECTMUSICINSTRUMENT if
 
     TRACE("(%p)->(): new ref = %u\n", iface, ref);
 
-    DMUSIC_LockModule();
-
     return ref;
 }
 
@@ -83,10 +81,9 @@ static ULONG WINAPI IDirectMusicInstrumentImpl_Release(LPDIRECTMUSICINSTRUMENT i
             HeapFree(GetProcessHeap(), 0, This->articulations->connections);
         HeapFree(GetProcessHeap(), 0, This->articulations);
         HeapFree(GetProcessHeap(), 0, This);
+        DMUSIC_UnlockModule();
     }
 
-    DMUSIC_UnlockModule();
-
     return ref;
 }
 
@@ -125,16 +122,22 @@ static const IDirectMusicInstrumentVtbl DirectMusicInstrument_Vtbl =
 /* for ClassFactory */
 HRESULT DMUSIC_CreateDirectMusicInstrumentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) {
 	IDirectMusicInstrumentImpl* dminst;
-	
+        HRESULT hr;
+
 	dminst = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicInstrumentImpl));
 	if (NULL == dminst) {
 		*ppobj = NULL;
 		return E_OUTOFMEMORY;
 	}
 	dminst->IDirectMusicInstrument_iface.lpVtbl = &DirectMusicInstrument_Vtbl;
-	dminst->ref = 0; /* will be inited by QueryInterface */
-	
-	return IDirectMusicInstrument_QueryInterface(&dminst->IDirectMusicInstrument_iface, lpcGUID, ppobj);
+        dminst->ref = 1;
+
+        DMUSIC_LockModule();
+        hr = IDirectMusicInstrument_QueryInterface(&dminst->IDirectMusicInstrument_iface, lpcGUID,
+                ppobj);
+        IDirectMusicInstrument_Release(&dminst->IDirectMusicInstrument_iface);
+
+        return hr;
 }
 
 static HRESULT read_from_stream(IStream *stream, void *data, ULONG size)




More information about the wine-cvs mailing list