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

Commit 08cec35e authored by Frederick Mayle's avatar Frederick Mayle Committed by Automerger Merge Worker
Browse files

Merge "libbinder: Don't abort when rpc parcel size is invalid" am: ec602d42...

Merge "libbinder: Don't abort when rpc parcel size is invalid" am: ec602d42 am: 6ae415f0 am: 864d1b73 am: 84657f32 am: 2280c1a6

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2153944



Change-Id: I69bb41437ee1060a2c3660b7d52a715ca636cef9
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 17073192 2280c1a6
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -648,14 +648,21 @@ status_t RpcState::waitForReply(const sp<RpcSession::RpcConnection>& connection,
    Span<const uint32_t> objectTableSpan;
    if (session->getProtocolVersion().value() >=
        RPC_WIRE_PROTOCOL_VERSION_RPC_HEADER_FEATURE_EXPLICIT_PARCEL_SIZE) {
        Span<const uint8_t> objectTableBytes = parcelSpan.splitOff(rpcReply.parcelDataSize);
        std::optional<Span<const uint8_t>> objectTableBytes =
                parcelSpan.splitOff(rpcReply.parcelDataSize);
        if (!objectTableBytes.has_value()) {
            ALOGE("Parcel size larger than available bytes: %" PRId32 " vs %zu. Terminating!",
                  rpcReply.parcelDataSize, parcelSpan.byteSize());
            (void)session->shutdownAndWait(false);
            return BAD_VALUE;
        }
        std::optional<Span<const uint32_t>> maybeSpan =
                objectTableBytes.reinterpret<const uint32_t>();
                objectTableBytes->reinterpret<const uint32_t>();
        if (!maybeSpan.has_value()) {
            ALOGE("Bad object table size inferred from RpcWireReply. Saw bodySize=%" PRId32
                  " sizeofHeader=%zu parcelSize=%" PRId32 " objectTableBytesSize=%zu. Terminating!",
                  command.bodySize, rpcReplyWireSize, rpcReply.parcelDataSize,
                  objectTableBytes.size);
                  objectTableBytes->size);
            return BAD_VALUE;
        }
        objectTableSpan = *maybeSpan;
@@ -898,15 +905,22 @@ processTransactInternalTailCall:
        Span<const uint32_t> objectTableSpan;
        if (session->getProtocolVersion().value() >
            RPC_WIRE_PROTOCOL_VERSION_RPC_HEADER_FEATURE_EXPLICIT_PARCEL_SIZE) {
            Span<const uint8_t> objectTableBytes = parcelSpan.splitOff(transaction->parcelDataSize);
            std::optional<Span<const uint8_t>> objectTableBytes =
                    parcelSpan.splitOff(transaction->parcelDataSize);
            if (!objectTableBytes.has_value()) {
                ALOGE("Parcel size (%" PRId32 ") greater than available bytes (%zu). Terminating!",
                      transaction->parcelDataSize, parcelSpan.byteSize());
                (void)session->shutdownAndWait(false);
                return BAD_VALUE;
            }
            std::optional<Span<const uint32_t>> maybeSpan =
                    objectTableBytes.reinterpret<const uint32_t>();
                    objectTableBytes->reinterpret<const uint32_t>();
            if (!maybeSpan.has_value()) {
                ALOGE("Bad object table size inferred from RpcWireTransaction. Saw bodySize=%zu "
                      "sizeofHeader=%zu parcelSize=%" PRId32
                      " objectTableBytesSize=%zu. Terminating!",
                      transactionData.size(), sizeof(RpcWireTransaction),
                      transaction->parcelDataSize, objectTableBytes.size);
                      transaction->parcelDataSize, objectTableBytes->size);
                return BAD_VALUE;
            }
            objectTableSpan = *maybeSpan;
+5 −3
Original line number Diff line number Diff line
@@ -48,9 +48,11 @@ struct Span {
    // Truncates `this` to a length of `offset` and returns a span with the
    // remainder.
    //
    // Aborts if offset > size.
    Span<T> splitOff(size_t offset) {
        LOG_ALWAYS_FATAL_IF(offset > size);
    // `std::nullopt` iff offset > size.
    std::optional<Span<T>> splitOff(size_t offset) {
        if (offset > size) {
            return std::nullopt;
        }
        Span<T> rest = {data + offset, size - offset};
        size = offset;
        return rest;