From 88e630170ef95f765fdeb95639080052661a1a81 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 30 Oct 2013 22:47:24 +0100 Subject: mixer/software: fix double free bug --- src/mixer/SoftwareMixerPlugin.cxx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mixer/SoftwareMixerPlugin.cxx b/src/mixer/SoftwareMixerPlugin.cxx index b7eb8ff0f..193e68f23 100644 --- a/src/mixer/SoftwareMixerPlugin.cxx +++ b/src/mixer/SoftwareMixerPlugin.cxx @@ -41,18 +41,28 @@ CreateVolumeFilter() struct SoftwareMixer final : public Mixer { Filter *filter; + /** + * If this is true, then this object "owns" the #Filter + * instance (see above). It will be set to false by + * software_mixer_get_filter(); after that, the caller will be + * responsible for the #Filter. + */ + bool owns_filter; + unsigned volume; SoftwareMixer() :Mixer(software_mixer_plugin), - filter(CreateVolumeFilter()), - volume(100) + filter(CreateVolumeFilter()), + owns_filter(true), + volume(100) { assert(filter != nullptr); } ~SoftwareMixer() { - delete filter; + if (owns_filter) + delete filter; } }; @@ -115,6 +125,8 @@ software_mixer_get_filter(Mixer *mixer) { SoftwareMixer *sm = (SoftwareMixer *)mixer; assert(sm->IsPlugin(software_mixer_plugin)); + assert(sm->owns_filter); + sm->owns_filter = false; return sm->filter; } -- cgit v1.2.3