From d36f4a5f130be7f7b29a8b63cedbc8edfa56db96 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 12 Jul 2010 11:05:38 -0700 Subject: [PATCH] StrictMode: gather and return violating stacks in Binder replies Now, when Thread A has a strict mode policy in effect and does a Binder call to Thread B (most likely in another process), the strict mode policy is passed along, but with the GATHER penalty bit set which overrides other policies and instead gathers all offending stack traces to a threadlocal which are then written back in the Parcel's reply header. Change-Id: I7d4497032a0609b37b1a2a15855f5c929ba0584d --- libs/binder/Parcel.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index bed893a0f..60babad37 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -51,6 +51,9 @@ // Note: must be kept in sync with android/os/StrictMode.java's PENALTY_GATHER #define STRICT_MODE_PENALTY_GATHER 0x100 +// Note: must be kept in sync with android/os/Parcel.java's EX_HAS_REPLY_HEADER +#define EX_HAS_REPLY_HEADER -128 + // XXX This can be made public if we want to provide // support for typed data. struct small_flat_data @@ -959,7 +962,15 @@ wp Parcel::readWeakBinder() const int32_t Parcel::readExceptionCode() const { int32_t exception_code = readAligned(); - // TODO: skip over the response header here, once that's in. + if (exception_code == EX_HAS_REPLY_HEADER) { + int32_t header_size = readAligned(); + // Skip over fat responses headers. Not used (or propagated) in + // native code + setDataPosition(dataPosition() + header_size); + // And fat response headers are currently only used when there are no + // exceptions, so return no error: + return 0; + } return exception_code; }