Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc2d9905 authored by Patrick Williams's avatar Patrick Williams
Browse files

Check exceptions in BBQ and SC JNI code

Updates the following callback wrappers to crash the client when
exceptions are thrown:

* TransactionCommittedListenerWrapper
* TransactionHangCallbackWrapper
* TrustedPresentationCallbackWrapper
* WindowInfosReportedListenerWrapper

This prevents misleading error messages where a later JNI call fails due
to a pending Java exception.

Bug: 278526360
Bug: 278573545
Test: presubmits
Change-Id: I796e46640b6d1ab43152de9040cbc4b7f25addb9
parent dfc317e1
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -72,12 +72,14 @@ public:
    }

    void onTransactionHang(const std::string& reason) {
        if (mTransactionHangObject) {
        if (!mTransactionHangObject) {
            return;
        }
        JNIEnv* env = getenv(mVm);
        ScopedLocalRef<jstring> jReason(env, env->NewStringUTF(reason.c_str()));
        getenv(mVm)->CallVoidMethod(mTransactionHangObject,
                                    gTransactionHangCallback.onTransactionHang, jReason.get());
        }
        DieIfException(env, "Uncaught exception in TransactionHangCallback.");
    }

private:
+3 −0
Original line number Diff line number Diff line
@@ -285,6 +285,7 @@ public:
        JNIEnv* env = getenv();
        env->CallVoidMethod(mTransactionCommittedListenerObject,
                            gTransactionCommittedListenerClassInfo.onTransactionCommitted);
        DieIfException(env, "Uncaught exception in TransactionCommittedListener.");
    }

    static void transactionCallbackThunk(void* context, nsecs_t /*latchTime*/,
@@ -325,6 +326,7 @@ public:
    binder::Status onWindowInfosReported() override {
        JNIEnv* env = getenv();
        env->CallVoidMethod(mListener, gRunnableClassInfo.run);
        DieIfException(env, "Uncaught exception in WindowInfosReportedListener.");
        return binder::Status::ok();
    }

@@ -356,6 +358,7 @@ public:
        env->CallVoidMethod(mTrustedPresentationCallback,
                            gTrustedPresentationCallbackClassInfo.onTrustedPresentationChanged,
                            inTrustedPresentationState);
        DieIfException(env, "Uncaught exception in TrustedPresentationCallback.");
    }

    void addCallbackRef(const sp<SurfaceComposerClient::PresentationCallbackRAII>& callbackRef) {
+9 −0
Original line number Diff line number Diff line
@@ -134,6 +134,15 @@ static inline JNIEnv* GetOrAttachJNIEnvironment(JavaVM* jvm, jint version = JNI_
    return env;
}

static inline void DieIfException(JNIEnv* env, const char* message) {
    if (env->ExceptionCheck()) {
        jnihelp::ExpandableString summary;
        jnihelp::ExpandableStringInitialize(&summary);
        jnihelp::GetStackTraceOrSummary(env, nullptr, &summary);
        LOG_ALWAYS_FATAL("%s\n%s", message, summary.data);
    }
}

}  // namespace android

#endif  // CORE_JNI_HELPERS