On 5/5/20 3:36 PM, Alistair Leslie-Hughes wrote:
@@ -81,6 +90,19 @@ static ULONG WINAPI wave_track_Release(IDirectMusicTrack8 *iface) TRACE("(%p) ref=%d\n", This, ref);
if (!ref) { + struct list *cursor, *cursor2; + struct DMUS_PRIVATE_WAVE_ITEM *item; + + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->items) { + item = LIST_ENTRY(cursor, struct DMUS_PRIVATE_WAVE_ITEM, entry); + list_remove(cursor); + + if (item->object) + IDirectMusicObject_Release(item->object); + + heap_free(item); + } + HeapFree(GetProcessHeap(), 0, This); DMIME_UnlockModule(); } LIST_FOR_EACH_ENTRY_SAFE() will make this shorter.
+ hr = IStream_QueryInterface (stream, &IID_IDirectMusicGetLoader, (void**)&getloader); + if (FAILED(hr)) + return hr; + + hr = IDirectMusicGetLoader_GetLoader (getloader, &loader); + if (FAILED(hr)) + return hr; + IDirectMusicGetLoader_Release (getloader); + + hr = IDirectMusicLoader_GetObject (loader, &description, &IID_IDirectMusicObject, (void**)&object); + IDirectMusicLoader_Release (loader); + + return SUCCEEDED(hr) ? S_OK : hr; This leaks 'getloader' on failure. Does this really work though? I should probably be GetObject((void**)object)?