Fix StreamerPlugin reference counting

* BReferenceable deleted itself when the latest
reference was released causing a double free.
* The code now avoid to call the function when
we are about to delete the object.
This commit is contained in:
Dario Casalinuovo
2016-09-07 20:42:43 +02:00
parent 3ff901ac71
commit ac8ca41623
+6 -5
View File
@@ -632,12 +632,12 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl url, BDataIO** source)
} }
(*streamer)->fMediaPlugin = plugin; (*streamer)->fMediaPlugin = plugin;
(*streamer)->fReference.AcquireReference();
BDataIO* streamSource = NULL; BDataIO* streamSource = NULL;
if ((*streamer)->Sniff(url, &streamSource) == B_OK) { if ((*streamer)->Sniff(url, &streamSource) == B_OK) {
TRACE("PluginManager::CreateStreamer: Sniff success\n"); TRACE("PluginManager::CreateStreamer: Sniff success\n");
*source = streamSource; *source = streamSource;
(*streamer)->fReference.AcquireReference();
return B_OK; return B_OK;
} }
@@ -661,13 +661,14 @@ PluginManager::DestroyStreamer(Streamer* streamer)
// destructor... // destructor...
MediaPlugin* plugin = streamer->fMediaPlugin; MediaPlugin* plugin = streamer->fMediaPlugin;
streamer->fReference.ReleaseReference();
// Delete the streamer only when every reference is released // Delete the streamer only when every reference is released
if (streamer->fReference.CountReferences() == 0) { // we avoid to call ReleaseReference on the last object
// and handle deletion when the streamer is destroyed.
if (streamer->fReference.CountReferences() == 1) {
delete streamer; delete streamer;
PutPlugin(plugin); PutPlugin(plugin);
} } else
streamer->fReference.ReleaseReference();
} }
} }