diff options
author | Steven Moreland <smoreland@google.com> | 2018-11-12 17:37:46 -0800 |
---|---|---|
committer | Steven Moreland <smoreland@google.com> | 2018-11-14 01:23:14 +0000 |
commit | f3034b03ada1d0804673246724e48f6ef0775935 (patch) | |
tree | cc224b8b56bd30a0c7d016f68579117df65b2f36 | |
parent | 94d4364d944642846e44c670bc6c9e08665bbbba (diff) | |
download | native-f3034b03ada1d0804673246724e48f6ef0775935.tar.gz |
libbinder_ndk: AIBinder_getCalling(Pid|Uid)
This is for feature-parity w/ the SDK. These methods are of the format
AIBinder_* since they are also static methods on android.os.Binder.
Bug: 111445392
Change-Id: Id33d454936daad492efd3792544f786f9915aa2b
Fixes: 119323183
Test: runtests.sh
-rw-r--r-- | libs/binder/ndk/ibinder.cpp | 9 | ||||
-rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_ibinder.h | 26 | ||||
-rw-r--r-- | libs/binder/ndk/libbinder_ndk.map.txt | 2 |
3 files changed, 37 insertions, 0 deletions
diff --git a/libs/binder/ndk/ibinder.cpp b/libs/binder/ndk/ibinder.cpp index f3fb9c37d8..f9c8c8a0ff 100644 --- a/libs/binder/ndk/ibinder.cpp +++ b/libs/binder/ndk/ibinder.cpp @@ -22,6 +22,7 @@ #include "status_internal.h" #include <android-base/logging.h> +#include <binder/IPCThreadState.h> using DeathRecipient = ::android::IBinder::DeathRecipient; @@ -346,6 +347,14 @@ binder_status_t AIBinder_unlinkToDeath(AIBinder* binder, AIBinder_DeathRecipient return recipient->unlinkToDeath(binder, cookie); } +uid_t AIBinder_getCallingUid() { + return ::android::IPCThreadState::self()->getCallingUid(); +} + +pid_t AIBinder_getCallingPid() { + return ::android::IPCThreadState::self()->getCallingPid(); +} + void AIBinder_incStrong(AIBinder* binder) { if (binder == nullptr) { LOG(ERROR) << __func__ << ": on null binder"; diff --git a/libs/binder/ndk/include_ndk/android/binder_ibinder.h b/libs/binder/ndk/include_ndk/android/binder_ibinder.h index d711ad81b4..9c6c55e736 100644 --- a/libs/binder/ndk/include_ndk/android/binder_ibinder.h +++ b/libs/binder/ndk/include_ndk/android/binder_ibinder.h @@ -28,6 +28,7 @@ #include <stdint.h> #include <sys/cdefs.h> +#include <sys/types.h> #include <android/binder_parcel.h> #include <android/binder_status.h> @@ -270,6 +271,31 @@ binder_status_t AIBinder_unlinkToDeath(AIBinder* binder, AIBinder_DeathRecipient void* cookie) __INTRODUCED_IN(29); /** + * This returns the calling UID assuming that this thread is called from a thread that is processing + * a binder transaction (for instance, in the implementation of AIBinder_Class_onTransact). + * + * This can be used with higher-level system services to determine the caller's identity and check + * permissions. + * + * \return calling uid or the current process's UID if this thread isn't processing a transaction. + */ +uid_t AIBinder_getCallingUid(); + +/** + * This returns the calling PID assuming that this thread is called from a thread that is processing + * a binder transaction (for instance, in the implementation of AIBinder_Class_onTransact). + * + * This can be used with higher-level system services to determine the caller's identity and check + * permissions. However, when doing this, one should be aware of possible TOCTOU problems when the + * calling process dies and is replaced with another process with elevated permissions and the same + * PID. + * + * \return calling pid or the current process's PID if this thread isn't processing a transaction. + * If the transaction being processed is a oneway transaction, then this method will return 0. + */ +pid_t AIBinder_getCallingPid(); + +/** * This can only be called if a strong reference to this object already exists in process. * * \param binder the binder object to add a refcount to. diff --git a/libs/binder/ndk/libbinder_ndk.map.txt b/libs/binder/ndk/libbinder_ndk.map.txt index d2c1a3dda8..7a75942406 100644 --- a/libs/binder/ndk/libbinder_ndk.map.txt +++ b/libs/binder/ndk/libbinder_ndk.map.txt @@ -7,6 +7,8 @@ LIBBINDER_NDK { # introduced=29 AIBinder_debugGetRefCount; AIBinder_decStrong; AIBinder_fromJavaBinder; + AIBinder_getCallingPid; + AIBinder_getCallingUid; AIBinder_getClass; AIBinder_getUserData; AIBinder_incStrong; |