diff options
author | Steven Moreland <smoreland@google.com> | 2022-01-21 23:55:15 +0000 |
---|---|---|
committer | Steven Moreland <smoreland@google.com> | 2022-02-03 00:15:32 +0000 |
commit | cf373696fe51bbd0db1da2a38aafe81bb04fc7e9 (patch) | |
tree | b79c7a7624e9ed2d91a92fe7ee4863a728a5168f | |
parent | ea7659e07baf893799ad7d51e341ab1d959ef078 (diff) | |
download | native-cf373696fe51bbd0db1da2a38aafe81bb04fc7e9.tar.gz |
libbinder: Status writeOverParcel
For errors written to the parcel late.
Bug: 211823183
Test: aidl_integration_test
Change-Id: I036a016e143408bf1c3cb4f67f622c7e0dac91bf
-rw-r--r-- | libs/binder/Status.cpp | 6 | ||||
-rw-r--r-- | libs/binder/include/binder/Status.h | 4 | ||||
-rw-r--r-- | libs/binder/tests/Android.bp | 1 | ||||
-rw-r--r-- | libs/binder/tests/binderStatusUnitTest.cpp | 35 |
4 files changed, 46 insertions, 0 deletions
diff --git a/libs/binder/Status.cpp b/libs/binder/Status.cpp index a44c578230..83b97d04c6 100644 --- a/libs/binder/Status.cpp +++ b/libs/binder/Status.cpp @@ -211,6 +211,12 @@ status_t Status::writeToParcel(Parcel* parcel) const { return status; } +status_t Status::writeOverParcel(Parcel* parcel) const { + parcel->setDataSize(0); + parcel->setDataPosition(0); + return writeToParcel(parcel); +} + void Status::setException(int32_t ex, const String8& message) { mException = ex; mErrorCode = ex == EX_TRANSACTION_FAILED ? FAILED_TRANSACTION : NO_ERROR; diff --git a/libs/binder/include/binder/Status.h b/libs/binder/include/binder/Status.h index aaafa36d40..af34695875 100644 --- a/libs/binder/include/binder/Status.h +++ b/libs/binder/include/binder/Status.h @@ -117,6 +117,10 @@ public: status_t readFromParcel(const Parcel& parcel); status_t writeToParcel(Parcel* parcel) const; + // Convenience API to replace a Parcel with a status value, w/o requiring + // calling multiple APIs (makes generated code smaller). + status_t writeOverParcel(Parcel* parcel) const; + // Set one of the pre-defined exception types defined above. void setException(int32_t ex, const String8& message); // Set a service specific exception with error code. diff --git a/libs/binder/tests/Android.bp b/libs/binder/tests/Android.bp index 5e5c495e79..2ce00b2255 100644 --- a/libs/binder/tests/Android.bp +++ b/libs/binder/tests/Android.bp @@ -98,6 +98,7 @@ cc_test { srcs: [ "binderParcelUnitTest.cpp", "binderBinderUnitTest.cpp", + "binderStatusUnitTest.cpp", ], shared_libs: [ "libbinder", diff --git a/libs/binder/tests/binderStatusUnitTest.cpp b/libs/binder/tests/binderStatusUnitTest.cpp new file mode 100644 index 0000000000..a32ec5cc31 --- /dev/null +++ b/libs/binder/tests/binderStatusUnitTest.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <binder/Parcel.h> +#include <binder/Status.h> +#include <gtest/gtest.h> + +using android::Parcel; +using android::binder::Status; + +TEST(Status, WriteOverParcel) { + Status status = Status::fromExceptionCode(Status::EX_NULL_POINTER); + + Parcel indirect; + indirect.writeInt32(64); + status.writeOverParcel(&indirect); + + Parcel direct; + status.writeToParcel(&direct); + + EXPECT_EQ(0, indirect.compareData(direct)); +} |