Merge "Add Binder.getCallingUidOrThrow method"

This commit is contained in:
Nikita Ioffe
2019-01-09 16:07:56 +00:00
committed by Android (Google) Code Review
4 changed files with 41 additions and 0 deletions

View File

@@ -33707,6 +33707,7 @@ package android.os {
method public static final void flushPendingCommands();
method public static final int getCallingPid();
method public static final int getCallingUid();
method public static final int getCallingUidOrThrow();
method public static final android.os.UserHandle getCallingUserHandle();
method public java.lang.String getInterfaceDescriptor();
method public boolean isBinderAlive();

View File

@@ -272,6 +272,30 @@ public class Binder implements IBinder {
@CriticalNative
public static final native int getCallingUid();
/**
* Returns {@code true} if the current thread is currently executing an
* incoming transaction.
*
* @hide
*/
@CriticalNative
public static final native boolean isHandlingTransaction();
/**
* Return the Linux uid assigned to the process that sent the transaction
* currently being processed.
*
* @throws IllegalStateException if the current thread is not currently
* executing an incoming transaction.
*/
public static final int getCallingUidOrThrow() {
if (!isHandlingTransaction()) {
throw new IllegalStateException(
"Thread is not in a binder transcation");
}
return getCallingUid();
}
/**
* Return the UserHandle assigned to the process that sent you the
* current transaction that is being processed. This is the user

View File

@@ -875,6 +875,11 @@ static jint android_os_Binder_getCallingUid()
return IPCThreadState::self()->getCallingUid();
}
static jboolean android_os_Binder_isHandlingTransaction()
{
return IPCThreadState::self()->isServingCall();
}
static jlong android_os_Binder_clearCallingIdentity()
{
return IPCThreadState::self()->clearCallingIdentity();
@@ -960,6 +965,8 @@ static const JNINativeMethod gBinderMethods[] = {
// @CriticalNative
{ "getCallingUid", "()I", (void*)android_os_Binder_getCallingUid },
// @CriticalNative
{ "isHandlingTransaction", "()Z", (void*)android_os_Binder_isHandlingTransaction },
// @CriticalNative
{ "clearCallingIdentity", "()J", (void*)android_os_Binder_clearCallingIdentity },
{ "restoreCallingIdentity", "(J)V", (void*)android_os_Binder_restoreCallingIdentity },
// @CriticalNative

View File

@@ -43,4 +43,13 @@ public class BinderTest extends TestCase {
Binder.restoreCallingWorkSource(token);
assertEquals(UID, Binder.getCallingWorkSourceUid());
}
@SmallTest
public void testGetCallingUidOrThrow() throws Exception {
try {
Binder.getCallingUidOrThrow();
throw new AssertionError("IllegalStateException expected");
} catch (IllegalStateException expected) {
}
}
}