Merge "Make getCallingUidOrThrow() not throw in clearCallingIdentity() blocks"

This commit is contained in:
Matt Gilbride
2022-11-22 11:14:41 +00:00
committed by Gerrit Code Review
3 changed files with 25 additions and 9 deletions

View File

@@ -327,17 +327,29 @@ public class Binder implements IBinder {
@CriticalNative @CriticalNative
public static final native boolean isDirectlyHandlingTransaction(); public static final native boolean isDirectlyHandlingTransaction();
/**
* Returns {@code true} if the current thread has had its identity
* set explicitly via {@link #clearCallingIdentity()}
*
* @hide
*/
@CriticalNative
private static native boolean hasExplicitIdentity();
/** /**
* Return the Linux UID assigned to the process that sent the transaction * Return the Linux UID assigned to the process that sent the transaction
* currently being processed. * currently being processed.
* *
* @throws IllegalStateException if the current thread is not currently * @throws IllegalStateException if the current thread is not currently
* executing an incoming transaction. * executing an incoming transaction and the calling identity has not been
* explicitly set with {@link #clearCallingIdentity()}
*/ */
public static final int getCallingUidOrThrow() { public static final int getCallingUidOrThrow() {
if (!isDirectlyHandlingTransaction()) { if (!isDirectlyHandlingTransaction() && !hasExplicitIdentity()) {
throw new IllegalStateException( throw new IllegalStateException(
"Thread is not in a binder transcation"); "Thread is not in a binder transaction, "
+ "and the calling identity has not been "
+ "explicitly set with clearCallingIdentity");
} }
return getCallingUid(); return getCallingUid();
} }

View File

@@ -983,6 +983,10 @@ static void android_os_Binder_restoreCallingIdentity(jlong token)
IPCThreadState::self()->restoreCallingIdentity(token); IPCThreadState::self()->restoreCallingIdentity(token);
} }
static jboolean android_os_Binder_hasExplicitIdentity() {
return IPCThreadState::self()->hasExplicitIdentity();
}
static void android_os_Binder_setThreadStrictModePolicy(jint policyMask) static void android_os_Binder_setThreadStrictModePolicy(jint policyMask)
{ {
IPCThreadState::self()->setStrictModePolicy(policyMask); IPCThreadState::self()->setStrictModePolicy(policyMask);
@@ -1079,6 +1083,8 @@ static const JNINativeMethod gBinderMethods[] = {
// @CriticalNative // @CriticalNative
{ "restoreCallingIdentity", "(J)V", (void*)android_os_Binder_restoreCallingIdentity }, { "restoreCallingIdentity", "(J)V", (void*)android_os_Binder_restoreCallingIdentity },
// @CriticalNative // @CriticalNative
{ "hasExplicitIdentity", "()Z", (void*)android_os_Binder_hasExplicitIdentity },
// @CriticalNative
{ "setThreadStrictModePolicy", "(I)V", (void*)android_os_Binder_setThreadStrictModePolicy }, { "setThreadStrictModePolicy", "(I)V", (void*)android_os_Binder_setThreadStrictModePolicy },
// @CriticalNative // @CriticalNative
{ "getThreadStrictModePolicy", "()I", (void*)android_os_Binder_getThreadStrictModePolicy }, { "getThreadStrictModePolicy", "()I", (void*)android_os_Binder_getThreadStrictModePolicy },

View File

@@ -20,6 +20,8 @@ import androidx.test.filters.SmallTest;
import junit.framework.TestCase; import junit.framework.TestCase;
import static org.testng.Assert.assertThrows;
public class BinderTest extends TestCase { public class BinderTest extends TestCase {
private static final int UID = 100; private static final int UID = 100;
@@ -45,12 +47,8 @@ public class BinderTest extends TestCase {
} }
@SmallTest @SmallTest
public void testGetCallingUidOrThrow() throws Exception { public void testGetCallingUidOrThrow_throws() throws Exception {
try { assertThrows(IllegalStateException.class, () -> Binder.getCallingUidOrThrow());
Binder.getCallingUidOrThrow();
throw new AssertionError("IllegalStateException expected");
} catch (IllegalStateException expected) {
}
} }
@SmallTest @SmallTest