From 46590fa3b03de6e910f3bf3d0e4b77e524202620 Mon Sep 17 00:00:00 2001 From: Mark Kuo Date: Mon, 29 Jun 2020 12:56:10 +1000 Subject: [PATCH] VideoPlayer: fix possible race condition In set_stream() we write to 'playback' while accessing the same object in _mix_audio() in audio thread. Protect the 'write' part in set_stream() to avoid possible crash in _mix_audio() function. (cherry picked from commit e435d57758017ae7e92b052dcdd64488934998c1) --- scene/gui/video_player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scene/gui/video_player.cpp b/scene/gui/video_player.cpp index 0a693d40236..e641675a946 100644 --- a/scene/gui/video_player.cpp +++ b/scene/gui/video_player.cpp @@ -212,10 +212,9 @@ bool VideoPlayer::has_expand() const { void VideoPlayer::set_stream(const Ref &p_stream) { stop(); + AudioServer::get_singleton()->lock(); mix_buffer.resize(AudioServer::get_singleton()->thread_get_mix_buffer_size()); - AudioServer::get_singleton()->unlock(); - stream = p_stream; if (stream.is_valid()) { stream->set_audio_track(audio_track); @@ -223,6 +222,7 @@ void VideoPlayer::set_stream(const Ref &p_stream) { } else { playback = Ref(); } + AudioServer::get_singleton()->unlock(); if (!playback.is_null()) { playback->set_loop(loops);