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

Commit f50a6304 authored by Steven Moreland's avatar Steven Moreland Committed by Automerger Merge Worker
Browse files

Merge "HwBinder: log exceptions from Java" am: 0226e893

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1501474

Change-Id: I96b7d6a15ce6d3ea3a3b62f0e20fef5653a9d24b
parents 2694b808 0226e893
Loading
Loading
Loading
Loading
+3 −9
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@

#include "android_os_HwBinder.h"

#include "android_util_Binder.h" // for binder_report_exception

#include "android_os_HwParcel.h"
#include "android_os_HwRemoteBinder.h"

@@ -183,15 +185,7 @@ status_t JHwBinder::onTransact(
        env->ExceptionDescribe();
        env->ExceptionClear();

        // It is illegal to call IsInstanceOf if there is a pending exception.
        // Attempting to do so results in a JniAbort which crashes the entire process.
        if (env->IsInstanceOf(excep, gErrorClass)) {
            /* It's an error */
            LOG(ERROR) << "Forcefully exiting";
            _exit(1);
        } else {
            LOG(ERROR) << "Uncaught exception!";
        }
        binder_report_exception(env, excep, "Uncaught error or exception in hwbinder!");

        env->DeleteLocalRef(excep);
    }
+14 −11
Original line number Diff line number Diff line
@@ -302,8 +302,9 @@ static void report_java_lang_error(JNIEnv* env, jthrowable error, const char* ms
    report_java_lang_error_fatal_error(env, error, msg);
}

static void report_exception(JNIEnv* env, jthrowable excep, const char* msg)
{
namespace android {

void binder_report_exception(JNIEnv* env, jthrowable excep, const char* msg) {
    env->ExceptionClear();

    ScopedLocalRef<jstring> tagstr(env, env->NewStringUTF(LOG_TAG));
@@ -331,6 +332,8 @@ static void report_exception(JNIEnv* env, jthrowable excep, const char* msg)
    }
}

} // namespace android

class JavaBBinderHolder;

class JavaBBinder : public BBinder
@@ -405,7 +408,7 @@ protected:

        if (env->ExceptionCheck()) {
            ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
            report_exception(env, excep.get(),
            binder_report_exception(env, excep.get(),
                                    "*** Uncaught remote exception!  "
                                    "(Exceptions are not yet supported across processes.)");
            res = JNI_FALSE;
@@ -421,7 +424,7 @@ protected:

        if (env->ExceptionCheck()) {
            ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
            report_exception(env, excep.get(),
            binder_report_exception(env, excep.get(),
                                    "*** Uncaught exception in onBinderStrictModePolicyChange");
        }

@@ -567,7 +570,7 @@ public:
                                      jBinderProxy.get());
            if (env->ExceptionCheck()) {
                jthrowable excep = env->ExceptionOccurred();
                report_exception(env, excep,
                binder_report_exception(env, excep,
                                        "*** Uncaught exception returned from death notification!");
            }

@@ -1163,7 +1166,7 @@ static void android_os_BinderInternal_proxyLimitcallback(int uid)

    if (env->ExceptionCheck()) {
        ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
        report_exception(env, excep.get(),
        binder_report_exception(env, excep.get(),
                                "*** Uncaught exception in binderProxyLimitCallbackFromNative");
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ extern void set_dalvik_blockguard_policy(JNIEnv* env, jint strict_policy);
extern void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
        bool canThrowRemoteException = false, int parcelSize = 0);

// does not take ownership of the exception, aborts if this is an error
void binder_report_exception(JNIEnv* env, jthrowable excep, const char* msg);
}

#endif