libbinderwrapper: Add GetCallingUid() and GetCallingPid().

Add methods to BinderWrapper for getting the caller's UID
and PID while in a transaction.

Bug: 24988639
Change-Id: Ibd711fc6b3d83623d4bb1060838c65aaef30d76e
This commit is contained in:
Daniel Erat 2015-10-16 09:04:33 -06:00
parent b8cc70a94b
commit 7cba9db9cd
5 changed files with 37 additions and 1 deletions

View File

@ -17,6 +17,8 @@
#ifndef SYSTEM_CORE_INCLUDE_BINDERWRAPPER_BINDER_WRAPPER_H_
#define SYSTEM_CORE_INCLUDE_BINDERWRAPPER_BINDER_WRAPPER_H_
#include <sys/types.h>
#include <string>
#include <base/callback.h>
@ -68,6 +70,10 @@ class BinderWrapper {
// Unregisters the callback, if any, for |binder|.
virtual bool UnregisterForDeathNotifications(const sp<IBinder>& binder) = 0;
// When called while in a transaction, returns the caller's UID or PID.
virtual uid_t GetCallingUid() = 0;
virtual pid_t GetCallingPid() = 0;
private:
static BinderWrapper* instance_;
};

View File

@ -77,6 +77,9 @@ class StubBinderWrapper : public BinderWrapper {
}
void clear_local_binders() { local_binders_.clear(); }
void set_calling_uid(uid_t uid) { calling_uid_ = uid; }
void set_calling_pid(pid_t pid) { calling_pid_ = pid; }
// Sets the binder to return when |service_name| is passed to GetService() or
// WaitForService().
void SetBinderForService(const std::string& service_name,
@ -97,6 +100,8 @@ class StubBinderWrapper : public BinderWrapper {
bool RegisterForDeathNotifications(const sp<IBinder>& binder,
const base::Closure& callback) override;
bool UnregisterForDeathNotifications(const sp<IBinder>& binder) override;
uid_t GetCallingUid() override;
pid_t GetCallingPid() override;
private:
using ServiceMap = std::map<std::string, sp<IBinder>>;
@ -116,6 +121,10 @@ class StubBinderWrapper : public BinderWrapper {
// death.
std::map<sp<IBinder>, base::Closure> death_callbacks_;
// Values to return from GetCallingUid() and GetCallingPid();
uid_t calling_uid_;
pid_t calling_pid_;
DISALLOW_COPY_AND_ASSIGN(StubBinderWrapper);
};

View File

@ -19,6 +19,7 @@
#include <base/logging.h>
#include <binder/Binder.h>
#include <binder/IBinder.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
namespace android {
@ -111,4 +112,12 @@ bool RealBinderWrapper::UnregisterForDeathNotifications(
return true;
}
uid_t RealBinderWrapper::GetCallingUid() {
return IPCThreadState::self()->getCallingUid();
}
pid_t RealBinderWrapper::GetCallingPid() {
return IPCThreadState::self()->getCallingPid();
}
} // namespace android

View File

@ -38,6 +38,8 @@ class RealBinderWrapper : public BinderWrapper {
bool RegisterForDeathNotifications(const sp<IBinder>& binder,
const base::Closure& callback) override;
bool UnregisterForDeathNotifications(const sp<IBinder>& binder) override;
uid_t GetCallingUid() override;
pid_t GetCallingPid() override;
private:
class DeathRecipient;

View File

@ -22,7 +22,9 @@
namespace android {
StubBinderWrapper::StubBinderWrapper() = default;
StubBinderWrapper::StubBinderWrapper()
: calling_uid_(-1),
calling_pid_(-1) {}
StubBinderWrapper::~StubBinderWrapper() = default;
@ -73,4 +75,12 @@ bool StubBinderWrapper::UnregisterForDeathNotifications(
return true;
}
uid_t StubBinderWrapper::GetCallingUid() {
return calling_uid_;
}
pid_t StubBinderWrapper::GetCallingPid() {
return calling_pid_;
}
} // namespace android