diff options
author | Josep del Rio <joseprio@google.com> | 2023-06-26 09:30:06 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-08-14 17:55:52 +0000 |
commit | 3d27bd3512b9b7870482488c75bb2a34e46bfe6b (patch) | |
tree | b1eb953c8d83631276d5689f60f6cf0a57378c51 | |
parent | 8f00d3e9152838197afd8a87f75f14a7f18fbe5d (diff) | |
download | base-3d27bd3512b9b7870482488c75bb2a34e46bfe6b.tar.gz |
Do not share key mappings with JNI object
The key mapping information between the native key mappings and
the KeyCharacterMap object available in Java is currently shared,
which means that a read can be attempted while it's being modified.
Bug: 274058082
Test: Patch tested by Oppo
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:3d993de0d1ada8065d1fe561f690c8f82b6a7d4b)
Merged-In: I745008a0a8ea30830660c45dcebee917b3913d13
Change-Id: I745008a0a8ea30830660c45dcebee917b3913d13
-rw-r--r-- | core/jni/android_view_InputDevice.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/core/jni/android_view_InputDevice.cpp b/core/jni/android_view_InputDevice.cpp index 9cc72437a023..f7c770e0bffb 100644 --- a/core/jni/android_view_InputDevice.cpp +++ b/core/jni/android_view_InputDevice.cpp @@ -42,6 +42,13 @@ jobject android_view_InputDevice_create(JNIEnv* env, const InputDeviceInfo& devi return NULL; } + // b/274058082: Pass a copy of the key character map to avoid concurrent + // access + std::shared_ptr<KeyCharacterMap> map = deviceInfo.getKeyCharacterMap(); + if (map != nullptr) { + map = std::make_shared<KeyCharacterMap>(*map); + } + ScopedLocalRef<jstring> descriptorObj(env, env->NewStringUTF(deviceInfo.getIdentifier().descriptor.c_str())); if (!descriptorObj.get()) { @@ -49,8 +56,8 @@ jobject android_view_InputDevice_create(JNIEnv* env, const InputDeviceInfo& devi } ScopedLocalRef<jobject> kcmObj(env, - android_view_KeyCharacterMap_create(env, deviceInfo.getId(), - deviceInfo.getKeyCharacterMap())); + android_view_KeyCharacterMap_create(env, deviceInfo.getId(), + map)); if (!kcmObj.get()) { return NULL; } |