From cc14188a9c74d2837bc1ad5447ac9d4261ab8794 Mon Sep 17 00:00:00 2001 From: Hossein Yousefi Date: Wed, 20 Mar 2024 05:13:28 +0100 Subject: [PATCH] fix getID bug jniEnv could be null before calling attachThread, even for getting the function pointer. --- pkgs/jni/CHANGELOG.md | 5 +++++ pkgs/jni/src/dartjni.c | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pkgs/jni/CHANGELOG.md b/pkgs/jni/CHANGELOG.md index 61869740ed..61e86d2eba 100644 --- a/pkgs/jni/CHANGELOG.md +++ b/pkgs/jni/CHANGELOG.md @@ -44,6 +44,11 @@ - **Breaking Change**: `JArray.filled` now uses the generated type class of the `fill` object and not its Java runtime type. +## 0.7.3 + +- Fixed a bug where `get(Static)MethodID` and `get(Static)FieldID` could access + null and throw. + ## 0.7.2 - Fixed a bug where reading non-null terminated strings would overflow. diff --git a/pkgs/jni/src/dartjni.c b/pkgs/jni/src/dartjni.c index 9e8ef32160..784430e6b4 100644 --- a/pkgs/jni/src/dartjni.c +++ b/pkgs/jni/src/dartjni.c @@ -207,25 +207,28 @@ static inline JniPointerResult _getId(MemberGetter getter, char* name, char* sig) { JniPointerResult result = {NULL, NULL}; - attach_thread(); result.value = getter(jniEnv, cls, name, sig); result.exception = check_exception(); return result; } JniPointerResult getMethodID(jclass cls, char* name, char* sig) { + attach_thread(); return _getId((MemberGetter)(*jniEnv)->GetMethodID, cls, name, sig); } JniPointerResult getStaticMethodID(jclass cls, char* name, char* sig) { + attach_thread(); return _getId((MemberGetter)(*jniEnv)->GetStaticMethodID, cls, name, sig); } JniPointerResult getFieldID(jclass cls, char* name, char* sig) { + attach_thread(); return _getId((MemberGetter)(*jniEnv)->GetFieldID, cls, name, sig); } JniPointerResult getStaticFieldID(jclass cls, char* name, char* sig) { + attach_thread(); return _getId((MemberGetter)(*jniEnv)->GetStaticFieldID, cls, name, sig); }