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

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

Merge "Revert "Fix the potential memory leak issue caused by setExtension.""...

Merge "Revert "Fix the potential memory leak issue caused by setExtension."" into main am: d34c9b3d

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



Change-Id: I9d17ed0f34781ddea4c16afcd90d532fbbf10123
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents e8a32257 d34c9b3d
Loading
Loading
Loading
Loading
+2 −14
Original line number Original line Diff line number Diff line
@@ -148,11 +148,6 @@ public class Binder implements IBinder {
     */
     */
    private static volatile boolean sStackTrackingEnabled = false;
    private static volatile boolean sStackTrackingEnabled = false;


    /**
     * The extension binder object
     */
    private IBinder mExtension = null;

    /**
    /**
     * Enable Binder IPC stack tracking. If enabled, every binder transaction will be logged to
     * Enable Binder IPC stack tracking. If enabled, every binder transaction will be logged to
     * {@link TransactionTracker}.
     * {@link TransactionTracker}.
@@ -1239,9 +1234,7 @@ public class Binder implements IBinder {


    /** @hide */
    /** @hide */
    @Override
    @Override
    public final @Nullable IBinder getExtension() {
    public final native @Nullable IBinder getExtension();
        return mExtension;
    }


    /**
    /**
     * Set the binder extension.
     * Set the binder extension.
@@ -1249,12 +1242,7 @@ public class Binder implements IBinder {
     *
     *
     * @hide
     * @hide
     */
     */
    public final void setExtension(@Nullable IBinder extension) {
    public final native void setExtension(@Nullable IBinder extension);
        mExtension = extension;
        setExtensionNative(extension);
    }

    private final native void setExtensionNative(@Nullable IBinder extension);


    /**
    /**
     * Default implementation rewinds the parcels and calls onTransact. On
     * Default implementation rewinds the parcels and calls onTransact. On
+21 −13
Original line number Original line Diff line number Diff line
@@ -74,7 +74,6 @@ static struct bindernative_offsets_t
    jmethodID mExecTransact;
    jmethodID mExecTransact;
    jmethodID mGetInterfaceDescriptor;
    jmethodID mGetInterfaceDescriptor;
    jmethodID mTransactionCallback;
    jmethodID mTransactionCallback;
    jmethodID mGetExtension;


    // Object state.
    // Object state.
    jfieldID mObject;
    jfieldID mObject;
@@ -490,12 +489,8 @@ public:
            if (mVintf) {
            if (mVintf) {
                ::android::internal::Stability::markVintf(b.get());
                ::android::internal::Stability::markVintf(b.get());
            }
            }
            if (mSetExtensionCalled) {
            if (mExtension != nullptr) {
                jobject javaIBinderObject = env->CallObjectMethod(obj, gBinderOffsets.mGetExtension);
                b.get()->setExtension(mExtension);
                sp<IBinder> extensionFromJava = ibinderForJavaObject(env, javaIBinderObject);
                if (extensionFromJava != nullptr) {
                    b.get()->setExtension(extensionFromJava);
                }
            }
            }
            mBinder = b;
            mBinder = b;
            ALOGV("Creating JavaBinder %p (refs %p) for Object %p, weakCount=%" PRId32 "\n",
            ALOGV("Creating JavaBinder %p (refs %p) for Object %p, weakCount=%" PRId32 "\n",
@@ -521,12 +516,21 @@ public:
        mVintf = false;
        mVintf = false;
    }
    }


    sp<IBinder> getExtension() {
        AutoMutex _l(mLock);
        sp<JavaBBinder> b = mBinder.promote();
        if (b != nullptr) {
            return b.get()->getExtension();
        }
        return mExtension;
    }

    void setExtension(const sp<IBinder>& extension) {
    void setExtension(const sp<IBinder>& extension) {
        AutoMutex _l(mLock);
        AutoMutex _l(mLock);
        mSetExtensionCalled = true;
        mExtension = extension;
        sp<JavaBBinder> b = mBinder.promote();
        sp<JavaBBinder> b = mBinder.promote();
        if (b != nullptr) {
        if (b != nullptr) {
            b.get()->setExtension(extension);
            b.get()->setExtension(mExtension);
        }
        }
    }
    }


@@ -538,7 +542,8 @@ private:
    // is too much binder state here, we can think about making JavaBBinder an
    // is too much binder state here, we can think about making JavaBBinder an
    // sp here (avoid recreating it)
    // sp here (avoid recreating it)
    bool            mVintf = false;
    bool            mVintf = false;
    bool            mSetExtensionCalled = false;

    sp<IBinder>     mExtension;
};
};


// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
@@ -1244,6 +1249,10 @@ static void android_os_Binder_blockUntilThreadAvailable(JNIEnv* env, jobject cla
    return IPCThreadState::self()->blockUntilThreadAvailable();
    return IPCThreadState::self()->blockUntilThreadAvailable();
}
}


static jobject android_os_Binder_getExtension(JNIEnv* env, jobject obj) {
    JavaBBinderHolder* jbh = (JavaBBinderHolder*) env->GetLongField(obj, gBinderOffsets.mObject);
    return javaObjectForIBinder(env, jbh->getExtension());
}


static void android_os_Binder_setExtension(JNIEnv* env, jobject obj, jobject extensionObject) {
static void android_os_Binder_setExtension(JNIEnv* env, jobject obj, jobject extensionObject) {
    JavaBBinderHolder* jbh = (JavaBBinderHolder*) env->GetLongField(obj, gBinderOffsets.mObject);
    JavaBBinderHolder* jbh = (JavaBBinderHolder*) env->GetLongField(obj, gBinderOffsets.mObject);
@@ -1286,7 +1295,8 @@ static const JNINativeMethod gBinderMethods[] = {
    { "getNativeBBinderHolder", "()J", (void*)android_os_Binder_getNativeBBinderHolder },
    { "getNativeBBinderHolder", "()J", (void*)android_os_Binder_getNativeBBinderHolder },
    { "getNativeFinalizer", "()J", (void*)android_os_Binder_getNativeFinalizer },
    { "getNativeFinalizer", "()J", (void*)android_os_Binder_getNativeFinalizer },
    { "blockUntilThreadAvailable", "()V", (void*)android_os_Binder_blockUntilThreadAvailable },
    { "blockUntilThreadAvailable", "()V", (void*)android_os_Binder_blockUntilThreadAvailable },
    { "setExtensionNative", "(Landroid/os/IBinder;)V", (void*)android_os_Binder_setExtension },
    { "getExtension", "()Landroid/os/IBinder;", (void*)android_os_Binder_getExtension },
    { "setExtension", "(Landroid/os/IBinder;)V", (void*)android_os_Binder_setExtension },
};
};
// clang-format on
// clang-format on


@@ -1303,8 +1313,6 @@ static int int_register_android_os_Binder(JNIEnv* env)
    gBinderOffsets.mTransactionCallback =
    gBinderOffsets.mTransactionCallback =
            GetStaticMethodIDOrDie(env, clazz, "transactionCallback", "(IIII)V");
            GetStaticMethodIDOrDie(env, clazz, "transactionCallback", "(IIII)V");
    gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J");
    gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J");
    gBinderOffsets.mGetExtension = GetMethodIDOrDie(env, clazz, "getExtension",
                                                        "()Landroid/os/IBinder;");


    return RegisterMethodsOrDie(
    return RegisterMethodsOrDie(
        env, kBinderPathName,
        env, kBinderPathName,