diff options
author | 2024-11-20 22:56:20 +0000 | |
---|---|---|
committer | 2024-11-22 23:49:50 +0000 | |
commit | 75885d9f92d19a2d7778a33f19a0c15fd5e13d14 (patch) | |
tree | 0066c89622c5083217b9f1376bd9d0cfa766d052 | |
parent | 6acbf87a229e00e7e48eef4daa045ce85f2f6c33 (diff) |
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
-rw-r--r-- | libs/binder/Parcel.cpp | 4 | ||||
-rw-r--r-- | libs/binder/tests/binderParcelUnitTest.cpp | 32 |
2 files changed, 33 insertions, 3 deletions
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 96d821e196..a5f416f1ba 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -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; diff --git a/libs/binder/tests/binderParcelUnitTest.cpp b/libs/binder/tests/binderParcelUnitTest.cpp index 32a70e5b11..6259d9d2d2 100644 --- a/libs/binder/tests/binderParcelUnitTest.cpp +++ b/libs/binder/tests/binderParcelUnitTest.cpp @@ -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"); |