diff --git a/core/java/android/os/IBinder.java b/core/java/android/os/IBinder.java index d91c458a474b0..010459d06e8d3 100644 --- a/core/java/android/os/IBinder.java +++ b/core/java/android/os/IBinder.java @@ -169,6 +169,15 @@ public interface IBinder { */ int FLAG_ONEWAY = 0x00000001; + /** + * Flag to {@link #transact}: request binder driver to clear transaction data. + * + * Be very careful when using this flag in Java, since Java objects read from a Java + * Parcel may be non-trivial to clear. + * @hide + */ + int FLAG_CLEAR_BUF = 0x00000020; + /** * @hide */ diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 9c7f8be6526b1..cf90174924f15 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -276,6 +276,8 @@ public final class Parcel { // see libbinder's binder/Status.h private static final int EX_TRANSACTION_FAILED = -129; + @CriticalNative + private static native void nativeMarkSensitive(long nativePtr); @CriticalNative private static native int nativeDataSize(long nativePtr); @CriticalNative @@ -490,6 +492,14 @@ public final class Parcel { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public static native long getGlobalAllocCount(); + /** + * Parcel data should be zero'd before realloc'd or deleted. + * @hide + */ + public final void markSensitive() { + nativeMarkSensitive(mNativePtr); + } + /** * Returns the total amount of data contained in the parcel. */ diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp index 9c7ee0c641a66..241570a7f9d34 100644 --- a/core/jni/android_os_Parcel.cpp +++ b/core/jni/android_os_Parcel.cpp @@ -90,6 +90,14 @@ void recycleJavaParcelObject(JNIEnv* env, jobject parcelObj) env->CallVoidMethod(parcelObj, gParcelOffsets.recycle); } +static void android_os_Parcel_markSensitive(jlong nativePtr) +{ + Parcel* parcel = reinterpret_cast(nativePtr); + if (parcel) { + parcel->markSensitive(); + } +} + static jint android_os_Parcel_dataSize(jlong nativePtr) { Parcel* parcel = reinterpret_cast(nativePtr); @@ -757,6 +765,8 @@ static jboolean android_os_Parcel_replaceCallingWorkSourceUid(jlong nativePtr, j // ---------------------------------------------------------------------------- static const JNINativeMethod gParcelMethods[] = { + // @CriticalNative + {"nativeMarkSensitive", "(J)V", (void*)android_os_Parcel_markSensitive}, // @CriticalNative {"nativeDataSize", "(J)I", (void*)android_os_Parcel_dataSize}, // @CriticalNative