Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3af936a1 authored by Steven Moreland's avatar Steven Moreland
Browse files

libbinder: RPC drop extra header info

A lot of the data written in interface tokens (work source, strict mode,
etc..) doesn't make sense in the context of RPC calls. Also, we don't
want to freeze this part of the wire protocol.

Bug: 167966510
Test: binderRpcTest
Change-Id: I5c0bb923d1d4c2a4ffa49b117dbed16bce0a1c20
parent 4e83ba78
Loading
Loading
Loading
Loading
+38 −32
Original line number Diff line number Diff line
@@ -41,11 +41,12 @@
#include <binder/TextOutput.h>

#include <cutils/ashmem.h>
#include <cutils/compiler.h>
#include <utils/Flattenable.h>
#include <utils/Log.h>
#include <utils/misc.h>
#include <utils/String8.h>
#include <utils/String16.h>
#include <utils/String8.h>
#include <utils/misc.h>

#include <private/binder/binder_module.h>
#include "RpcState.h"
@@ -590,12 +591,14 @@ status_t Parcel::writeInterfaceToken(const String16& interface)
}

status_t Parcel::writeInterfaceToken(const char16_t* str, size_t len) {
    if (CC_LIKELY(!isForRpc())) {
        const IPCThreadState* threadState = IPCThreadState::self();
        writeInt32(threadState->getStrictModePolicy() | STRICT_MODE_PENALTY_GATHER);
        updateWorkSourceRequestHeaderPosition();
    writeInt32(threadState->shouldPropagateWorkSource() ?
            threadState->getCallingWorkSourceUid() : IPCThreadState::kUnsetWorkSource);
        writeInt32(threadState->shouldPropagateWorkSource() ? threadState->getCallingWorkSourceUid()
                                                            : IPCThreadState::kUnsetWorkSource);
        writeInt32(kHeader);
    }

    // currently the interface identification token is just its name as a string
    return writeString16(str, len);
@@ -642,17 +645,17 @@ bool Parcel::enforceInterface(const char16_t* interface,
                              size_t len,
                              IPCThreadState* threadState) const
{
    if (CC_LIKELY(!isForRpc())) {
        // StrictModePolicy.
        int32_t strictPolicy = readInt32();
        if (threadState == nullptr) {
            threadState = IPCThreadState::self();
        }
    if ((threadState->getLastTransactionBinderFlags() &
         IBinder::FLAG_ONEWAY) != 0) {
        if ((threadState->getLastTransactionBinderFlags() & IBinder::FLAG_ONEWAY) != 0) {
            // For one-way calls, the callee is running entirely
            // disconnected from the caller, so disable StrictMode entirely.
            // Not only does disk/network usage not impact the caller, but
      // there's no way to commuicate back any violations anyway.
            // there's no way to communicate back violations anyway.
            threadState->setStrictModePolicy(0);
        } else {
            threadState->setStrictModePolicy(strictPolicy);
@@ -664,9 +667,12 @@ bool Parcel::enforceInterface(const char16_t* interface,
        // vendor header
        int32_t header = readInt32();
        if (header != kHeader) {
        ALOGE("Expecting header 0x%x but found 0x%x. Mixing copies of libbinder?", kHeader, header);
            ALOGE("Expecting header 0x%x but found 0x%x. Mixing copies of libbinder?", kHeader,
                  header);
            return false;
        }
    }

    // Interface descriptor.
    size_t parcel_interface_len;
    const char16_t* parcel_interface = readString16Inplace(&parcel_interface_len);