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. // Writes the RPC header.
status_t writeInterfaceToken(const String16& interface); status_t writeInterfaceToken(const String16& interface);
// Parses the RPC header, returning true if the interface name // Parses the RPC header, returning true if the interface name
// in the header matches the expected interface from the caller. // 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; bool checkInterface(IBinder*) const;
void freeData(); void freeData();

View File

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

View File

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