diff options
author | Steven Moreland <smoreland@google.com> | 2022-06-10 17:42:03 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2022-06-10 17:42:03 +0000 |
commit | c25cfc6c8fe92fd92875a4d7717bbfe8f1bbdd48 (patch) | |
tree | c15711f0a35830eb4664ef82509a40eae01661a8 | |
parent | 8f52763ddb1a34189edf32e4c9010248498e854c (diff) | |
parent | 6653bde0b61f3707e4df283ca9ac537696b819c0 (diff) | |
download | native-c25cfc6c8fe92fd92875a4d7717bbfe8f1bbdd48.tar.gz |
Merge "libbinder: Status - fix read at end of Parcel"
-rw-r--r-- | libs/binder/Status.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/libs/binder/Status.cpp b/libs/binder/Status.cpp index 83b97d04c6..dba65878fb 100644 --- a/libs/binder/Status.cpp +++ b/libs/binder/Status.cpp @@ -139,6 +139,9 @@ status_t Status::readFromParcel(const Parcel& parcel) { mMessage = String8(message.value_or(String16())); // Skip over the remote stack trace data + const size_t remote_start = parcel.dataPosition(); + // Get available size before reading more + const size_t remote_avail = parcel.dataAvail(); int32_t remote_stack_trace_header_size; status = parcel.readInt32(&remote_stack_trace_header_size); if (status != OK) { @@ -146,13 +149,16 @@ status_t Status::readFromParcel(const Parcel& parcel) { return status; } if (remote_stack_trace_header_size < 0 || - static_cast<size_t>(remote_stack_trace_header_size) > parcel.dataAvail()) { + static_cast<size_t>(remote_stack_trace_header_size) > remote_avail) { android_errorWriteLog(0x534e4554, "132650049"); setFromStatusT(UNKNOWN_ERROR); return UNKNOWN_ERROR; } - parcel.setDataPosition(parcel.dataPosition() + remote_stack_trace_header_size); + + if (remote_stack_trace_header_size != 0) { + parcel.setDataPosition(remote_start + remote_stack_trace_header_size); + } if (mException == EX_SERVICE_SPECIFIC) { status = parcel.readInt32(&mErrorCode); |