From 9aed9ab212720a9769ea472c9a66f103e9e7adeb Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 5 May 2021 10:40:18 -0700 Subject: [PATCH 1/4] Added exception if you try to reply with a non-direct ByteBuffer. --- .../android/io/flutter/embedding/engine/FlutterJNI.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java b/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java index b4aaff8bcde33..17f918174af50 100644 --- a/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java +++ b/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java @@ -902,8 +902,11 @@ private native void nativeInvokePlatformMessageEmptyResponseCallback( // TODO(mattcarroll): differentiate between channel responses and platform responses. @UiThread public void invokePlatformMessageResponseCallback( - int responseId, @Nullable ByteBuffer message, int position) { + int responseId, @NonNull ByteBuffer message, int position) { ensureRunningOnMainThread(); + if (!message.isDirect()) { + throw new IllegalArgumentException("Expected a direct ByteBuffer."); + } if (isAttached()) { nativeInvokePlatformMessageResponseCallback( nativeShellHolderId, responseId, message, position); From 2981e4d518413fe1af1c7ff31f2283debb1721fe Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 5 May 2021 13:29:53 -0700 Subject: [PATCH 2/4] added dcheck --- shell/platform/android/platform_view_android.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/android/platform_view_android.cc b/shell/platform/android/platform_view_android.cc index 1420fbebe4b9b..aa83d9cacbfeb 100644 --- a/shell/platform/android/platform_view_android.cc +++ b/shell/platform/android/platform_view_android.cc @@ -220,6 +220,7 @@ void PlatformViewAndroid::InvokePlatformMessageResponseCallback( return; uint8_t* response_data = static_cast(env->GetDirectBufferAddress(java_response_data)); + FML_DCHECK(response_data != nullptr); std::vector response = std::vector( response_data, response_data + java_response_position); auto message_response = std::move(it->second); From 49c597d0512c3878b063e250870036cd69c020af Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 5 May 2021 14:18:48 -0700 Subject: [PATCH 3/4] added a test --- .../test/io/flutter/embedding/engine/FlutterJNITest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java b/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java index 5f8eeea590172..b705efa21e31a 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java @@ -17,6 +17,8 @@ import io.flutter.embedding.engine.systemchannels.LocalizationChannel; import io.flutter.plugin.localization.LocalizationPlugin; import io.flutter.plugin.platform.PlatformViewsController; + +import java.nio.ByteBuffer; import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; @@ -237,4 +239,11 @@ public void createOverlaySurface__callsPlatformViewsController() { // --- Verify Results --- verify(platformViewsController, times(1)).createOverlaySurface(); } + + @Test(expected = IllegalArgumentException.class) + public void invokePlatformMessageResponseCallback__wantsDirectBuffer() { + FlutterJNI flutterJNI = new FlutterJNI(); + ByteBuffer buffer = ByteBuffer.allocate(4); + flutterJNI.invokePlatformMessageResponseCallback(0, buffer, buffer.position()); + } } From 28b214a0bfb1eaf88529c1b1a0343d79cba43840 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 5 May 2021 14:27:43 -0700 Subject: [PATCH 4/4] format --- .../android/test/io/flutter/embedding/engine/FlutterJNITest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java b/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java index b705efa21e31a..5f057c36609a0 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java @@ -17,7 +17,6 @@ import io.flutter.embedding.engine.systemchannels.LocalizationChannel; import io.flutter.plugin.localization.LocalizationPlugin; import io.flutter.plugin.platform.PlatformViewsController; - import java.nio.ByteBuffer; import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger;