diff options
| author | 2019-08-02 20:04:19 +0000 | |
|---|---|---|
| committer | 2019-08-02 20:04:19 +0000 | |
| commit | 10e4cc4a536fd56d24efd72fcb5894c8a6f45eed (patch) | |
| tree | f9dcb5dd4dd7ba819535e5fcf4e0dbd86309de84 /libs/binder/Parcel.cpp | |
| parent | cd551fab41affb10b11bc6019741898694a123c8 (diff) | |
| parent | 7b10226a880b51591e192ff2c0415aa6fa50ce6d (diff) | |
Merge changes from topic "reland-binder-interface-stability" into stage-aosp-master
* changes:
Keep Parcel size stable.
Reland "Binder: support storing interface stability"
Diffstat (limited to 'libs/binder/Parcel.cpp')
| -rw-r--r-- | libs/binder/Parcel.cpp | 74 |
1 files changed, 48 insertions, 26 deletions
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 55374306f3..ba44c66020 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -77,6 +77,9 @@ static size_t pad_size(size_t s) { namespace android { +// many things compile this into prebuilts on the stack +static_assert(sizeof(Parcel) == 60 || sizeof(Parcel) == 120); + static pthread_mutex_t gParcelGlobalAllocSizeLock = PTHREAD_MUTEX_INITIALIZER; static size_t gParcelGlobalAllocSize = 0; static size_t gParcelGlobalAllocCount = 0; @@ -164,14 +167,34 @@ static void release_object(const sp<ProcessState>& proc, ALOGE("Invalid object type 0x%08x", obj.hdr.type); } -inline static status_t finish_flatten_binder( - const sp<IBinder>& /*binder*/, const flat_binder_object& flat, Parcel* out) +status_t Parcel::finishFlattenBinder( + const sp<IBinder>& binder, const flat_binder_object& flat) +{ + status_t status = writeObject(flat, false); + if (status != OK) return status; + + return writeInt32(internal::Stability::get(binder.get())); +} + +status_t Parcel::finishUnflattenBinder( + const sp<IBinder>& binder, sp<IBinder>* out) const { - return out->writeObject(flat, false); + int32_t stability; + status_t status = readInt32(&stability); + if (status != OK) return status; + + if (!internal::Stability::check(stability, mRequiredStability)) { + return BAD_TYPE; + } + + status = internal::Stability::set(binder.get(), stability); + if (status != OK) return status; + + *out = binder; + return OK; } -static status_t flatten_binder(const sp<ProcessState>& /*proc*/, - const sp<IBinder>& binder, Parcel* out) +status_t Parcel::flattenBinder(const sp<IBinder>& binder) { flat_binder_object obj; @@ -209,30 +232,24 @@ static status_t flatten_binder(const sp<ProcessState>& /*proc*/, obj.cookie = 0; } - return finish_flatten_binder(binder, obj, out); + return finishFlattenBinder(binder, obj); } -inline static status_t finish_unflatten_binder( - BpBinder* /*proxy*/, const flat_binder_object& /*flat*/, - const Parcel& /*in*/) +status_t Parcel::unflattenBinder(sp<IBinder>* out) const { - return NO_ERROR; -} - -static status_t unflatten_binder(const sp<ProcessState>& proc, - const Parcel& in, sp<IBinder>* out) -{ - const flat_binder_object* flat = in.readObject(false); + const flat_binder_object* flat = readObject(false); if (flat) { switch (flat->hdr.type) { - case BINDER_TYPE_BINDER: - *out = reinterpret_cast<IBinder*>(flat->cookie); - return finish_unflatten_binder(nullptr, *flat, in); - case BINDER_TYPE_HANDLE: - *out = proc->getStrongProxyForHandle(flat->handle); - return finish_unflatten_binder( - static_cast<BpBinder*>(out->get()), *flat, in); + case BINDER_TYPE_BINDER: { + sp<IBinder> binder = reinterpret_cast<IBinder*>(flat->cookie); + return finishUnflattenBinder(binder, out); + } + case BINDER_TYPE_HANDLE: { + sp<IBinder> binder = + ProcessState::self()->getStrongProxyForHandle(flat->handle); + return finishUnflattenBinder(binder, out); + } } } return BAD_TYPE; @@ -337,6 +354,10 @@ status_t Parcel::setDataCapacity(size_t size) return NO_ERROR; } +void Parcel::setTransactingBinder(const sp<IBinder>& binder) const { + mRequiredStability = internal::Stability::get(binder.get()); +} + status_t Parcel::setData(const uint8_t* buffer, size_t len) { if (len > INT32_MAX) { @@ -1032,7 +1053,7 @@ status_t Parcel::writeString16(const char16_t* str, size_t len) status_t Parcel::writeStrongBinder(const sp<IBinder>& val) { - return flatten_binder(ProcessState::self(), val, this); + return flattenBinder(val); } status_t Parcel::writeStrongBinderVector(const std::vector<sp<IBinder>>& val) @@ -1978,7 +1999,7 @@ status_t Parcel::readStrongBinder(sp<IBinder>* val) const status_t Parcel::readNullableStrongBinder(sp<IBinder>* val) const { - return unflatten_binder(ProcessState::self(), *this, val); + return unflattenBinder(val); } sp<IBinder> Parcel::readStrongBinder() const @@ -2682,9 +2703,10 @@ void Parcel::initState() mObjectsCapacity = 0; mNextObjectHint = 0; mObjectsSorted = false; + mAllowFds = true; mHasFds = false; mFdsKnown = true; - mAllowFds = true; + mRequiredStability = internal::Stability::UNDECLARED; mOwner = nullptr; mOpenAshmemSize = 0; mWorkSourceRequestHeaderPosition = 0; |