Skip to content

Commit 7fb9afe

Browse files
rbernonjulliard
authored andcommitted
dmband: Avoid leaking bands on band track Release.
1 parent 696e8c1 commit 7fb9afe

File tree

2 files changed

+35
-16
lines changed

2 files changed

+35
-16
lines changed

dlls/dmband/bandtrack.c

+35-10
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,26 @@
2222
WINE_DEFAULT_DEBUG_CHANNEL(dmband);
2323
WINE_DECLARE_DEBUG_CHANNEL(dmfile);
2424

25+
struct band_entry
26+
{
27+
struct list entry;
28+
DMUS_PRIVATE_BAND_ITEM_HEADER head;
29+
IDirectMusicBand *band;
30+
};
31+
32+
static void band_entry_destroy(struct band_entry *entry)
33+
{
34+
IDirectMusicTrack_Release(entry->band);
35+
free(entry);
36+
}
37+
2538
struct band_track
2639
{
2740
IDirectMusicTrack8 IDirectMusicTrack8_iface;
2841
struct dmobject dmobj; /* IPersistStream only */
2942
LONG ref;
3043
DMUS_IO_BAND_TRACK_HEADER header;
31-
struct list Bands;
44+
struct list bands;
3245
};
3346

3447
static inline struct band_track *impl_from_IDirectMusicTrack8(IDirectMusicTrack8 *iface)
@@ -76,7 +89,18 @@ static ULONG WINAPI band_track_Release(IDirectMusicTrack8 *iface)
7689

7790
TRACE("(%p) ref=%ld\n", This, ref);
7891

79-
if (!ref) free(This);
92+
if (!ref)
93+
{
94+
struct band_entry *entry, *next;
95+
96+
LIST_FOR_EACH_ENTRY_SAFE(entry, next, &This->bands, struct band_entry, entry)
97+
{
98+
list_remove(&entry->entry);
99+
band_entry_destroy(entry);
100+
}
101+
102+
free(This);
103+
}
80104

81105
return ref;
82106
}
@@ -337,13 +361,14 @@ static HRESULT load_band(struct band_track *This, IStream *pClonedStream,
337361
/*
338362
* @TODO insert pBand into This
339363
*/
340-
if (SUCCEEDED(hr)) {
341-
LPDMUS_PRIVATE_BAND pNewBand;
342-
if (!(pNewBand = calloc(1, sizeof(*pNewBand)))) return E_OUTOFMEMORY;
343-
pNewBand->BandHeader = *pHeader;
344-
pNewBand->band = *ppBand;
345-
IDirectMusicBand_AddRef(*ppBand);
346-
list_add_tail (&This->Bands, &pNewBand->entry);
364+
if (SUCCEEDED(hr))
365+
{
366+
struct band_entry *entry;
367+
if (!(entry = calloc(1, sizeof(*entry)))) return E_OUTOFMEMORY;
368+
entry->head = *pHeader;
369+
entry->band = *ppBand;
370+
IDirectMusicBand_AddRef(*ppBand);
371+
list_add_tail(&This->bands, &entry->entry);
347372
}
348373

349374
return S_OK;
@@ -635,7 +660,7 @@ HRESULT create_dmbandtrack(REFIID lpcGUID, void **ppobj)
635660
track->ref = 1;
636661
dmobject_init(&track->dmobj, &CLSID_DirectMusicBandTrack, (IUnknown *)&track->IDirectMusicTrack8_iface);
637662
track->dmobj.IPersistStream_iface.lpVtbl = &band_track_persist_stream_vtbl;
638-
list_init (&track->Bands);
663+
list_init(&track->bands);
639664

640665
hr = IDirectMusicTrack8_QueryInterface(&track->IDirectMusicTrack8_iface, lpcGUID, ppobj);
641666
IDirectMusicTrack8_Release(&track->IDirectMusicTrack8_iface);

dlls/dmband/dmband_private.h

-6
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,6 @@ typedef struct _DMUS_PRIVATE_INSTRUMENT {
6767
IDirectMusicCollection* ppReferenceCollection;
6868
} DMUS_PRIVATE_INSTRUMENT, *LPDMUS_PRIVATE_INSTRUMENT;
6969

70-
typedef struct _DMUS_PRIVATE_BAND {
71-
struct list entry; /* for listing elements */
72-
DMUS_PRIVATE_BAND_ITEM_HEADER BandHeader;
73-
IDirectMusicBand *band;
74-
} DMUS_PRIVATE_BAND, *LPDMUS_PRIVATE_BAND;
75-
7670
/*****************************************************************************
7771
* Misc.
7872
*/

0 commit comments

Comments
 (0)