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

Commit 75885d9f authored by Steven Moreland's avatar Steven Moreland
Browse files

readCString: implemented with readInplace

All read logic must go through and be validated
in the same few places.

Bug: 376674798
Test: binderClearBufTest covers this, and in presubmit
Change-Id: Icc0ade84b671ecd3026069d8f672ff254d58e995
parent 6acbf87a
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -2223,9 +2223,7 @@ const char* Parcel::readCString() const
        const char* eos = reinterpret_cast<const char*>(memchr(str, 0, avail));
        if (eos) {
            const size_t len = eos - str;
            mDataPos += pad_size(len+1);
            ALOGV("readCString Setting data pos of %p to %zu", this, mDataPos);
            return str;
            return static_cast<const char*>(readInplace(len + 1));
        }
    }
    return nullptr;
+32 −0
Original line number Diff line number Diff line
@@ -33,6 +33,38 @@ using android::String8;
using android::binder::Status;
using android::binder::unique_fd;

static void checkCString(const char* str) {
    for (size_t i = 0; i < 3; i++) {
        Parcel p;

        for (size_t j = 0; j < i; j++) p.writeInt32(3);

        p.writeCString(str);
        int32_t pos = p.dataPosition();

        p.setDataPosition(0);

        for (size_t j = 0; j < i; j++) p.readInt32();
        const char* str2 = p.readCString();

        ASSERT_EQ(std::string(str), str2);
        ASSERT_EQ(pos, p.dataPosition());
    }
}

TEST(Parcel, TestReadCString) {
    // we should remove the *CString APIs, but testing them until
    // they are deleted.
    checkCString("");
    checkCString("a");
    checkCString("\n");
    checkCString("32");
    checkCString("321");
    checkCString("3210");
    checkCString("3210b");
    checkCString("123434");
}

TEST(Parcel, NonNullTerminatedString8) {
    String8 kTestString = String8("test-is-good");