From 7c49258b9104b25b43f124c9869a418ef02f8f2e Mon Sep 17 00:00:00 2001
From: John Lin <jolin@mozilla.com>
Date: Mon, 22 May 2023 17:11:34 +0000
Subject: [PATCH] Bug 1832832 - protect encoder accesses in Java callbacks.
 r=media-playback-reviewers,alwu a=pascalc

Differential Revision: https://phabricator.services.mozilla.com/D178564
---
 dom/media/platforms/android/AndroidDataEncoder.cpp | 10 ++++++++--
 dom/media/platforms/android/AndroidDataEncoder.h   | 14 ++++++++++++--
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/dom/media/platforms/android/AndroidDataEncoder.cpp b/dom/media/platforms/android/AndroidDataEncoder.cpp
index b2e5d6bad0e3a..c611857039a76 100644
--- a/dom/media/platforms/android/AndroidDataEncoder.cpp
+++ b/dom/media/platforms/android/AndroidDataEncoder.cpp
@@ -494,7 +494,10 @@ void AndroidDataEncoder<ConfigType>::CallbacksSupport::HandleInput(
 template <typename ConfigType>
 void AndroidDataEncoder<ConfigType>::CallbacksSupport::HandleOutput(
     java::Sample::Param aSample, java::SampleBuffer::Param aBuffer) {
-  mEncoder->ProcessOutput(std::move(aSample), std::move(aBuffer));
+  MutexAutoLock lock(mMutex);
+  if (mEncoder) {
+    mEncoder->ProcessOutput(std::move(aSample), std::move(aBuffer));
+  }
 }
 
 template <typename ConfigType>
@@ -504,7 +507,10 @@ void AndroidDataEncoder<ConfigType>::CallbacksSupport::
 template <typename ConfigType>
 void AndroidDataEncoder<ConfigType>::CallbacksSupport::HandleError(
     const MediaResult& aError) {
-  mEncoder->Error(aError);
+  MutexAutoLock lock(mMutex);
+  if (mEncoder) {
+    mEncoder->Error(aError);
+  }
 }
 
 // Force compiler to generate code.
diff --git a/dom/media/platforms/android/AndroidDataEncoder.h b/dom/media/platforms/android/AndroidDataEncoder.h
index 92514a4705dfd..b7752e2a43da5 100644
--- a/dom/media/platforms/android/AndroidDataEncoder.h
+++ b/dom/media/platforms/android/AndroidDataEncoder.h
@@ -13,6 +13,7 @@
 
 #include "mozilla/Maybe.h"
 #include "mozilla/Monitor.h"
+#include "mozilla/Mutex.h"
 
 namespace mozilla {
 
@@ -36,7 +37,15 @@ class AndroidDataEncoder final : public MediaDataEncoder {
   class CallbacksSupport final : public JavaCallbacksSupport {
    public:
     explicit CallbacksSupport(AndroidDataEncoder* aEncoder)
-        : mEncoder(aEncoder) {}
+        : mMutex("AndroidDataEncoder::CallbacksSupport") {
+      MutexAutoLock lock(mMutex);
+      mEncoder = aEncoder;
+    }
+
+    ~CallbacksSupport() {
+      MutexAutoLock lock(mMutex);
+      mEncoder = nullptr;
+    }
 
     void HandleInput(int64_t aTimestamp, bool aProcessed) override;
     void HandleOutput(java::Sample::Param aSample,
@@ -46,7 +55,8 @@ class AndroidDataEncoder final : public MediaDataEncoder {
     void HandleError(const MediaResult& aError) override;
 
    private:
-    AndroidDataEncoder* mEncoder;
+    Mutex mMutex;
+    AndroidDataEncoder* mEncoder MOZ_GUARDED_BY(mMutex);
   };
   friend class CallbacksSupport;
 
-- 
GitLab