Module: wine
Branch: master
Commit: 2a1fd9851c33fae7d8cc3b6ef63e9bf8a0effe4f
URL:
https://gitlab.winehq.org/wine/wine/-/commit/2a1fd9851c33fae7d8cc3b6ef63e9b…
Author: Rémi Bernon <rbernon(a)codeweavers.com>
Date: Fri Sep 22 20:56:17 2023 +0200
dmusic: Avoid leaking articulations when freeing regions.
---
dlls/dmusic/instrument.c | 24 +++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c
index 8ce3c0bc979..54ce7508ee4 100644
--- a/dlls/dmusic/instrument.c
+++ b/dlls/dmusic/instrument.c
@@ -44,6 +44,19 @@ struct region
BOOL loop_present;
};
+static void region_destroy(struct region *region)
+{
+ struct articulation *articulation, *next;
+
+ LIST_FOR_EACH_ENTRY_SAFE(articulation, next, ®ion->articulations, struct
articulation, entry)
+ {
+ list_remove(&articulation->entry);
+ free(articulation);
+ }
+
+ free(region);
+}
+
struct instrument
{
IDirectMusicInstrument IDirectMusicInstrument_iface;
@@ -122,15 +135,8 @@ static ULONG WINAPI instrument_Release(LPDIRECTMUSICINSTRUMENT
iface)
LIST_FOR_EACH_ENTRY_SAFE(region, next_region, &This->regions, struct
region, entry)
{
- LIST_FOR_EACH_ENTRY_SAFE(articulation, next_articulation,
®ion->articulations,
- struct articulation, entry)
- {
- list_remove(&articulation->entry);
- free(articulation);
- }
-
list_remove(®ion->entry);
- free(region);
+ region_destroy(region);
}
collection_internal_release(This->collection);
@@ -322,7 +328,7 @@ static HRESULT parse_rgn_chunk(struct instrument *This, IStream
*stream, struct
if (FAILED(hr)) break;
}
- if (FAILED(hr)) free(region);
+ if (FAILED(hr)) region_destroy(region);
else list_add_tail(&This->regions, ®ion->entry);
return hr;