From dbad909b4e0d34bcc12d8a4818470584af90f7ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 24 Jul 2017 11:50:06 +0200 Subject: [PATCH] BMediaFile: fix MediaExtractor crash. * stop the extractor processing before deleting the source. * crash happened in MediaPlayer FilePlaylistItem::_CalculateDuration(). * was a regression introduced in hrev50671. * fixes #13156. --- headers/private/media/MediaExtractor.h | 3 +++ src/kits/media/MediaExtractor.cpp | 25 ++++++++++++++++++------- src/kits/media/MediaFile.cpp | 6 ++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/headers/private/media/MediaExtractor.h b/headers/private/media/MediaExtractor.h index eb3220386a..eeefca70bb 100644 --- a/headers/private/media/MediaExtractor.h +++ b/headers/private/media/MediaExtractor.h @@ -72,6 +72,9 @@ public: status_t GetStreamMetaData(int32 stream, BMessage* _data) const; + void StopProcessing(); + + private: void _Init(BDataIO* source, int32 flags); diff --git a/src/kits/media/MediaExtractor.cpp b/src/kits/media/MediaExtractor.cpp index 1029c29ccf..8696279827 100644 --- a/src/kits/media/MediaExtractor.cpp +++ b/src/kits/media/MediaExtractor.cpp @@ -147,13 +147,8 @@ MediaExtractor::~MediaExtractor() { CALLED(); -#if !DISABLE_CHUNK_CACHE - // terminate extractor thread - delete_sem(fExtractorWaitSem); - - status_t status; - wait_for_thread(fExtractorThread, &status); -#endif + // stop the extractor thread, if still running + StopProcessing(); // free all stream cookies // and chunk caches @@ -412,6 +407,22 @@ MediaExtractor::GetStreamMetaData(int32 stream, BMessage* _data) const } +void +MediaExtractor::StopProcessing() +{ +#if !DISABLE_CHUNK_CACHE + if (fExtractorWaitSem > -1) { + // terminate extractor thread + delete_sem(fExtractorWaitSem); + fExtractorWaitSem = -1; + + status_t status; + wait_for_thread(fExtractorThread, &status); + } +#endif +} + + void MediaExtractor::_RecycleLastChunk(stream_info& info) { diff --git a/src/kits/media/MediaFile.cpp b/src/kits/media/MediaFile.cpp index ba81c5f6a1..79b0f0ed35 100644 --- a/src/kits/media/MediaFile.cpp +++ b/src/kits/media/MediaFile.cpp @@ -471,6 +471,12 @@ BMediaFile::_UnInit() free(fTrackList); fTrackList = NULL; fTrackNum = 0; + + // Tells the extractor to stop its asynchronous processing + // before deleting its source + if (fExtractor != NULL) + fExtractor->StopProcessing(); + if (fDeleteSource) { delete fSource; fSource = NULL;