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

Commit 2034effb authored by Steven Moreland's avatar Steven Moreland
Browse files

libbinder: Parcel::appendFrom better format check

(thanks jooyung@ for the catch here)

Even if we have two RPC parcels, they need to both be for the RPC
session. Otherwise, they might be at different versions (and we don't
really have a way to reconcile this).

Bug: 182939048
Test: binderRpcTest
Change-Id: I5180ebc681ccc79bf05a3fc0900a9b240e793a66
parent d8b3d5f0
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -411,8 +411,9 @@ status_t Parcel::setData(const uint8_t* buffer, size_t len)

status_t Parcel::appendFrom(const Parcel *parcel, size_t offset, size_t len)
{
    if (parcel->isForRpc() != isForRpc()) {
        ALOGE("Cannot append Parcel of one format to another.");
    if (mSession != parcel->mSession) {
        ALOGE("Cannot append Parcel from one context to another. They may be different formats, "
              "and objects are specific to a context.");
        return BAD_TYPE;
    }

+10 −2
Original line number Diff line number Diff line
@@ -690,13 +690,21 @@ TEST_P(BinderRpc, TransactionsMustBeMarkedRpc) {
}

TEST_P(BinderRpc, AppendSeparateFormats) {
    auto proc = createRpcTestSocketServerProcess({});
    auto proc1 = createRpcTestSocketServerProcess({});
    auto proc2 = createRpcTestSocketServerProcess({});

    Parcel pRaw;

    Parcel p1;
    p1.markForBinder(proc.rootBinder);
    p1.markForBinder(proc1.rootBinder);
    p1.writeInt32(3);

    EXPECT_EQ(BAD_TYPE, p1.appendFrom(&pRaw, 0, p1.dataSize()));
    EXPECT_EQ(BAD_TYPE, pRaw.appendFrom(&p1, 0, p1.dataSize()));

    Parcel p2;
    p2.markForBinder(proc2.rootBinder);
    p2.writeInt32(7);

    EXPECT_EQ(BAD_TYPE, p1.appendFrom(&p2, 0, p2.dataSize()));
    EXPECT_EQ(BAD_TYPE, p2.appendFrom(&p1, 0, p1.dataSize()));