More StrictMode work, keeping Binder & BlockGuard's thread-locals in-sync.

Change-Id: Ia67cabcc17a73a0f15907ffea683d06bc41b90e5
This commit is contained in:
Brad Fitzpatrick 2010-07-07 16:06:39 -07:00
parent f568a7480d
commit a877cd85b5
3 changed files with 18 additions and 5 deletions

View File

@ -58,9 +58,13 @@ public:
// Writes the RPC header.
status_t writeInterfaceToken(const String16& interface);
// Parses the RPC header, returning true if the interface name
// in the header matches the expected interface from the caller.
bool enforceInterface(const String16& interface) const;
// If strict_policy_out is non-NULL, the RPC header's StrictMode policy
// mask is returned.
bool enforceInterface(const String16& interface,
int32_t* strict_policy_out = NULL) const;
bool checkInterface(IBinder*) const;
void freeData();

View File

@ -372,8 +372,8 @@ void IPCThreadState::setStrictModePolicy(int32_t policy)
mStrictModePolicy = policy;
}
int32_t IPCThreadState::getStrictModePolicy() const {
int32_t IPCThreadState::getStrictModePolicy() const
{
return mStrictModePolicy;
}

View File

@ -48,6 +48,9 @@
#define PAD_SIZE(s) (((s)+3)&~3)
// Note: must be kept in sync with android/os/StrictMode.java's PENALTY_GATHER
#define STRICT_MODE_PENALTY_GATHER 0x100
// XXX This can be made public if we want to provide
// support for typed data.
struct small_flat_data
@ -440,7 +443,8 @@ bool Parcel::hasFileDescriptors() const
// Write RPC headers. (previously just the interface token)
status_t Parcel::writeInterfaceToken(const String16& interface)
{
writeInt32(IPCThreadState::self()->getStrictModePolicy());
writeInt32(IPCThreadState::self()->getStrictModePolicy() |
STRICT_MODE_PENALTY_GATHER);
// currently the interface identification token is just its name as a string
return writeString16(interface);
}
@ -450,9 +454,14 @@ bool Parcel::checkInterface(IBinder* binder) const
return enforceInterface(binder->getInterfaceDescriptor());
}
bool Parcel::enforceInterface(const String16& interface) const
bool Parcel::enforceInterface(const String16& interface,
int32_t* strict_policy_out) const
{
int32_t strict_policy = readInt32();
IPCThreadState::self()->setStrictModePolicy(strict_policy);
if (strict_policy_out != NULL) {
*strict_policy_out = strict_policy;
}
const String16 str(readString16());
if (str == interface) {
return true;