1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <binder/Status.h>
18*38e8c45fSAndroid Build Coastguard Worker
19*38e8c45fSAndroid Build Coastguard Worker namespace android {
20*38e8c45fSAndroid Build Coastguard Worker namespace binder {
21*38e8c45fSAndroid Build Coastguard Worker
ok()22*38e8c45fSAndroid Build Coastguard Worker Status Status::ok() {
23*38e8c45fSAndroid Build Coastguard Worker return Status();
24*38e8c45fSAndroid Build Coastguard Worker }
25*38e8c45fSAndroid Build Coastguard Worker
fromExceptionCode(int32_t exceptionCode)26*38e8c45fSAndroid Build Coastguard Worker Status Status::fromExceptionCode(int32_t exceptionCode) {
27*38e8c45fSAndroid Build Coastguard Worker if (exceptionCode == EX_TRANSACTION_FAILED) {
28*38e8c45fSAndroid Build Coastguard Worker return Status(exceptionCode, FAILED_TRANSACTION);
29*38e8c45fSAndroid Build Coastguard Worker }
30*38e8c45fSAndroid Build Coastguard Worker return Status(exceptionCode, OK);
31*38e8c45fSAndroid Build Coastguard Worker }
32*38e8c45fSAndroid Build Coastguard Worker
fromExceptionCode(int32_t exceptionCode,const String8 & message)33*38e8c45fSAndroid Build Coastguard Worker Status Status::fromExceptionCode(int32_t exceptionCode,
34*38e8c45fSAndroid Build Coastguard Worker const String8& message) {
35*38e8c45fSAndroid Build Coastguard Worker if (exceptionCode == EX_TRANSACTION_FAILED) {
36*38e8c45fSAndroid Build Coastguard Worker return Status(exceptionCode, FAILED_TRANSACTION, message);
37*38e8c45fSAndroid Build Coastguard Worker }
38*38e8c45fSAndroid Build Coastguard Worker return Status(exceptionCode, OK, message);
39*38e8c45fSAndroid Build Coastguard Worker }
40*38e8c45fSAndroid Build Coastguard Worker
fromExceptionCode(int32_t exceptionCode,const char * message)41*38e8c45fSAndroid Build Coastguard Worker Status Status::fromExceptionCode(int32_t exceptionCode,
42*38e8c45fSAndroid Build Coastguard Worker const char* message) {
43*38e8c45fSAndroid Build Coastguard Worker return fromExceptionCode(exceptionCode, String8(message));
44*38e8c45fSAndroid Build Coastguard Worker }
45*38e8c45fSAndroid Build Coastguard Worker
fromServiceSpecificError(int32_t serviceSpecificErrorCode)46*38e8c45fSAndroid Build Coastguard Worker Status Status::fromServiceSpecificError(int32_t serviceSpecificErrorCode) {
47*38e8c45fSAndroid Build Coastguard Worker return Status(EX_SERVICE_SPECIFIC, serviceSpecificErrorCode);
48*38e8c45fSAndroid Build Coastguard Worker }
49*38e8c45fSAndroid Build Coastguard Worker
fromServiceSpecificError(int32_t serviceSpecificErrorCode,const String8 & message)50*38e8c45fSAndroid Build Coastguard Worker Status Status::fromServiceSpecificError(int32_t serviceSpecificErrorCode,
51*38e8c45fSAndroid Build Coastguard Worker const String8& message) {
52*38e8c45fSAndroid Build Coastguard Worker return Status(EX_SERVICE_SPECIFIC, serviceSpecificErrorCode, message);
53*38e8c45fSAndroid Build Coastguard Worker }
54*38e8c45fSAndroid Build Coastguard Worker
fromServiceSpecificError(int32_t serviceSpecificErrorCode,const char * message)55*38e8c45fSAndroid Build Coastguard Worker Status Status::fromServiceSpecificError(int32_t serviceSpecificErrorCode,
56*38e8c45fSAndroid Build Coastguard Worker const char* message) {
57*38e8c45fSAndroid Build Coastguard Worker return fromServiceSpecificError(serviceSpecificErrorCode, String8(message));
58*38e8c45fSAndroid Build Coastguard Worker }
59*38e8c45fSAndroid Build Coastguard Worker
fromStatusT(status_t status)60*38e8c45fSAndroid Build Coastguard Worker Status Status::fromStatusT(status_t status) {
61*38e8c45fSAndroid Build Coastguard Worker Status ret;
62*38e8c45fSAndroid Build Coastguard Worker ret.setFromStatusT(status);
63*38e8c45fSAndroid Build Coastguard Worker return ret;
64*38e8c45fSAndroid Build Coastguard Worker }
65*38e8c45fSAndroid Build Coastguard Worker
exceptionToString(int32_t exceptionCode)66*38e8c45fSAndroid Build Coastguard Worker std::string Status::exceptionToString(int32_t exceptionCode) {
67*38e8c45fSAndroid Build Coastguard Worker switch (exceptionCode) {
68*38e8c45fSAndroid Build Coastguard Worker #define EXCEPTION_TO_CASE(EXCEPTION) case EXCEPTION: return #EXCEPTION;
69*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_NONE)
70*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_SECURITY)
71*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_BAD_PARCELABLE)
72*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_ILLEGAL_ARGUMENT)
73*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_NULL_POINTER)
74*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_ILLEGAL_STATE)
75*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_NETWORK_MAIN_THREAD)
76*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_UNSUPPORTED_OPERATION)
77*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_SERVICE_SPECIFIC)
78*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_PARCELABLE)
79*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_HAS_REPLY_HEADER)
80*38e8c45fSAndroid Build Coastguard Worker EXCEPTION_TO_CASE(EX_TRANSACTION_FAILED)
81*38e8c45fSAndroid Build Coastguard Worker #undef EXCEPTION_TO_CASE
82*38e8c45fSAndroid Build Coastguard Worker default: return std::to_string(exceptionCode);
83*38e8c45fSAndroid Build Coastguard Worker }
84*38e8c45fSAndroid Build Coastguard Worker }
85*38e8c45fSAndroid Build Coastguard Worker
Status(int32_t exceptionCode,int32_t errorCode)86*38e8c45fSAndroid Build Coastguard Worker Status::Status(int32_t exceptionCode, int32_t errorCode)
87*38e8c45fSAndroid Build Coastguard Worker : mException(exceptionCode),
88*38e8c45fSAndroid Build Coastguard Worker mErrorCode(errorCode) {}
89*38e8c45fSAndroid Build Coastguard Worker
Status(int32_t exceptionCode,int32_t errorCode,const String8 & message)90*38e8c45fSAndroid Build Coastguard Worker Status::Status(int32_t exceptionCode, int32_t errorCode, const String8& message)
91*38e8c45fSAndroid Build Coastguard Worker : mException(exceptionCode),
92*38e8c45fSAndroid Build Coastguard Worker mErrorCode(errorCode),
93*38e8c45fSAndroid Build Coastguard Worker mMessage(message) {}
94*38e8c45fSAndroid Build Coastguard Worker
readFromParcel(const Parcel & parcel)95*38e8c45fSAndroid Build Coastguard Worker status_t Status::readFromParcel(const Parcel& parcel) {
96*38e8c45fSAndroid Build Coastguard Worker status_t status = parcel.readInt32(&mException);
97*38e8c45fSAndroid Build Coastguard Worker if (status != OK) {
98*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(status);
99*38e8c45fSAndroid Build Coastguard Worker return status;
100*38e8c45fSAndroid Build Coastguard Worker }
101*38e8c45fSAndroid Build Coastguard Worker
102*38e8c45fSAndroid Build Coastguard Worker if (mException == EX_HAS_NOTED_APPOPS_REPLY_HEADER) {
103*38e8c45fSAndroid Build Coastguard Worker status = skipUnusedHeader(parcel);
104*38e8c45fSAndroid Build Coastguard Worker if (status != OK) {
105*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(status);
106*38e8c45fSAndroid Build Coastguard Worker return status;
107*38e8c45fSAndroid Build Coastguard Worker }
108*38e8c45fSAndroid Build Coastguard Worker // Read next exception code.
109*38e8c45fSAndroid Build Coastguard Worker status = parcel.readInt32(&mException);
110*38e8c45fSAndroid Build Coastguard Worker if (status != OK) {
111*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(status);
112*38e8c45fSAndroid Build Coastguard Worker return status;
113*38e8c45fSAndroid Build Coastguard Worker }
114*38e8c45fSAndroid Build Coastguard Worker }
115*38e8c45fSAndroid Build Coastguard Worker
116*38e8c45fSAndroid Build Coastguard Worker // Skip over fat response headers. Not used (or propagated) in native code.
117*38e8c45fSAndroid Build Coastguard Worker if (mException == EX_HAS_REPLY_HEADER) {
118*38e8c45fSAndroid Build Coastguard Worker status = skipUnusedHeader(parcel);
119*38e8c45fSAndroid Build Coastguard Worker if (status != OK) {
120*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(status);
121*38e8c45fSAndroid Build Coastguard Worker return status;
122*38e8c45fSAndroid Build Coastguard Worker }
123*38e8c45fSAndroid Build Coastguard Worker
124*38e8c45fSAndroid Build Coastguard Worker // And fat response headers are currently only used when there are no
125*38e8c45fSAndroid Build Coastguard Worker // exceptions, so act like there was no error.
126*38e8c45fSAndroid Build Coastguard Worker mException = EX_NONE;
127*38e8c45fSAndroid Build Coastguard Worker }
128*38e8c45fSAndroid Build Coastguard Worker
129*38e8c45fSAndroid Build Coastguard Worker if (mException == EX_NONE) {
130*38e8c45fSAndroid Build Coastguard Worker return status;
131*38e8c45fSAndroid Build Coastguard Worker }
132*38e8c45fSAndroid Build Coastguard Worker
133*38e8c45fSAndroid Build Coastguard Worker // The remote threw an exception. Get the message back.
134*38e8c45fSAndroid Build Coastguard Worker std::optional<String16> message;
135*38e8c45fSAndroid Build Coastguard Worker status = parcel.readString16(&message);
136*38e8c45fSAndroid Build Coastguard Worker if (status != OK) {
137*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(status);
138*38e8c45fSAndroid Build Coastguard Worker return status;
139*38e8c45fSAndroid Build Coastguard Worker }
140*38e8c45fSAndroid Build Coastguard Worker mMessage = String8(message.value_or(String16()));
141*38e8c45fSAndroid Build Coastguard Worker
142*38e8c45fSAndroid Build Coastguard Worker // Skip over the remote stack trace data
143*38e8c45fSAndroid Build Coastguard Worker const size_t remote_start = parcel.dataPosition();
144*38e8c45fSAndroid Build Coastguard Worker // Get available size before reading more
145*38e8c45fSAndroid Build Coastguard Worker const size_t remote_avail = parcel.dataAvail();
146*38e8c45fSAndroid Build Coastguard Worker int32_t remote_stack_trace_header_size;
147*38e8c45fSAndroid Build Coastguard Worker status = parcel.readInt32(&remote_stack_trace_header_size);
148*38e8c45fSAndroid Build Coastguard Worker if (status != OK) {
149*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(status);
150*38e8c45fSAndroid Build Coastguard Worker return status;
151*38e8c45fSAndroid Build Coastguard Worker }
152*38e8c45fSAndroid Build Coastguard Worker if (remote_stack_trace_header_size < 0 ||
153*38e8c45fSAndroid Build Coastguard Worker static_cast<size_t>(remote_stack_trace_header_size) > remote_avail) {
154*38e8c45fSAndroid Build Coastguard Worker
155*38e8c45fSAndroid Build Coastguard Worker android_errorWriteLog(0x534e4554, "132650049");
156*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(UNKNOWN_ERROR);
157*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
158*38e8c45fSAndroid Build Coastguard Worker }
159*38e8c45fSAndroid Build Coastguard Worker
160*38e8c45fSAndroid Build Coastguard Worker if (remote_stack_trace_header_size != 0) {
161*38e8c45fSAndroid Build Coastguard Worker parcel.setDataPosition(remote_start + remote_stack_trace_header_size);
162*38e8c45fSAndroid Build Coastguard Worker }
163*38e8c45fSAndroid Build Coastguard Worker
164*38e8c45fSAndroid Build Coastguard Worker if (mException == EX_SERVICE_SPECIFIC) {
165*38e8c45fSAndroid Build Coastguard Worker status = parcel.readInt32(&mErrorCode);
166*38e8c45fSAndroid Build Coastguard Worker } else if (mException == EX_PARCELABLE) {
167*38e8c45fSAndroid Build Coastguard Worker // Skip over the blob of Parcelable data
168*38e8c45fSAndroid Build Coastguard Worker const size_t header_start = parcel.dataPosition();
169*38e8c45fSAndroid Build Coastguard Worker // Get available size before reading more
170*38e8c45fSAndroid Build Coastguard Worker const size_t header_avail = parcel.dataAvail();
171*38e8c45fSAndroid Build Coastguard Worker
172*38e8c45fSAndroid Build Coastguard Worker int32_t header_size;
173*38e8c45fSAndroid Build Coastguard Worker status = parcel.readInt32(&header_size);
174*38e8c45fSAndroid Build Coastguard Worker if (status != OK) {
175*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(status);
176*38e8c45fSAndroid Build Coastguard Worker return status;
177*38e8c45fSAndroid Build Coastguard Worker }
178*38e8c45fSAndroid Build Coastguard Worker
179*38e8c45fSAndroid Build Coastguard Worker if (header_size < 0 || static_cast<size_t>(header_size) > header_avail) {
180*38e8c45fSAndroid Build Coastguard Worker android_errorWriteLog(0x534e4554, "132650049");
181*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(UNKNOWN_ERROR);
182*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
183*38e8c45fSAndroid Build Coastguard Worker }
184*38e8c45fSAndroid Build Coastguard Worker
185*38e8c45fSAndroid Build Coastguard Worker parcel.setDataPosition(header_start + header_size);
186*38e8c45fSAndroid Build Coastguard Worker }
187*38e8c45fSAndroid Build Coastguard Worker if (status != OK) {
188*38e8c45fSAndroid Build Coastguard Worker setFromStatusT(status);
189*38e8c45fSAndroid Build Coastguard Worker return status;
190*38e8c45fSAndroid Build Coastguard Worker }
191*38e8c45fSAndroid Build Coastguard Worker
192*38e8c45fSAndroid Build Coastguard Worker return status;
193*38e8c45fSAndroid Build Coastguard Worker }
194*38e8c45fSAndroid Build Coastguard Worker
writeToParcel(Parcel * parcel) const195*38e8c45fSAndroid Build Coastguard Worker status_t Status::writeToParcel(Parcel* parcel) const {
196*38e8c45fSAndroid Build Coastguard Worker // Something really bad has happened, and we're not going to even
197*38e8c45fSAndroid Build Coastguard Worker // try returning rich error data.
198*38e8c45fSAndroid Build Coastguard Worker if (mException == EX_TRANSACTION_FAILED) {
199*38e8c45fSAndroid Build Coastguard Worker return mErrorCode;
200*38e8c45fSAndroid Build Coastguard Worker }
201*38e8c45fSAndroid Build Coastguard Worker
202*38e8c45fSAndroid Build Coastguard Worker status_t status = parcel->writeInt32(mException);
203*38e8c45fSAndroid Build Coastguard Worker if (status != OK) return status;
204*38e8c45fSAndroid Build Coastguard Worker if (mException == EX_NONE) {
205*38e8c45fSAndroid Build Coastguard Worker // We have no more information to write.
206*38e8c45fSAndroid Build Coastguard Worker return status;
207*38e8c45fSAndroid Build Coastguard Worker }
208*38e8c45fSAndroid Build Coastguard Worker status = parcel->writeString16(String16(mMessage));
209*38e8c45fSAndroid Build Coastguard Worker if (status != OK) return status;
210*38e8c45fSAndroid Build Coastguard Worker status = parcel->writeInt32(0); // Empty remote stack trace header
211*38e8c45fSAndroid Build Coastguard Worker if (status != OK) return status;
212*38e8c45fSAndroid Build Coastguard Worker if (mException == EX_SERVICE_SPECIFIC) {
213*38e8c45fSAndroid Build Coastguard Worker status = parcel->writeInt32(mErrorCode);
214*38e8c45fSAndroid Build Coastguard Worker } else if (mException == EX_PARCELABLE) {
215*38e8c45fSAndroid Build Coastguard Worker // Sending Parcelable blobs currently not supported
216*38e8c45fSAndroid Build Coastguard Worker status = parcel->writeInt32(0);
217*38e8c45fSAndroid Build Coastguard Worker }
218*38e8c45fSAndroid Build Coastguard Worker return status;
219*38e8c45fSAndroid Build Coastguard Worker }
220*38e8c45fSAndroid Build Coastguard Worker
writeOverParcel(Parcel * parcel) const221*38e8c45fSAndroid Build Coastguard Worker status_t Status::writeOverParcel(Parcel* parcel) const {
222*38e8c45fSAndroid Build Coastguard Worker parcel->setDataSize(0);
223*38e8c45fSAndroid Build Coastguard Worker parcel->setDataPosition(0);
224*38e8c45fSAndroid Build Coastguard Worker return writeToParcel(parcel);
225*38e8c45fSAndroid Build Coastguard Worker }
226*38e8c45fSAndroid Build Coastguard Worker
setException(int32_t ex,const String8 & message)227*38e8c45fSAndroid Build Coastguard Worker void Status::setException(int32_t ex, const String8& message) {
228*38e8c45fSAndroid Build Coastguard Worker mException = ex;
229*38e8c45fSAndroid Build Coastguard Worker mErrorCode = ex == EX_TRANSACTION_FAILED ? FAILED_TRANSACTION : NO_ERROR;
230*38e8c45fSAndroid Build Coastguard Worker mMessage.setTo(message);
231*38e8c45fSAndroid Build Coastguard Worker }
232*38e8c45fSAndroid Build Coastguard Worker
setServiceSpecificError(int32_t errorCode,const String8 & message)233*38e8c45fSAndroid Build Coastguard Worker void Status::setServiceSpecificError(int32_t errorCode, const String8& message) {
234*38e8c45fSAndroid Build Coastguard Worker setException(EX_SERVICE_SPECIFIC, message);
235*38e8c45fSAndroid Build Coastguard Worker mErrorCode = errorCode;
236*38e8c45fSAndroid Build Coastguard Worker }
237*38e8c45fSAndroid Build Coastguard Worker
setFromStatusT(status_t status)238*38e8c45fSAndroid Build Coastguard Worker void Status::setFromStatusT(status_t status) {
239*38e8c45fSAndroid Build Coastguard Worker mException = (status == NO_ERROR) ? EX_NONE : EX_TRANSACTION_FAILED;
240*38e8c45fSAndroid Build Coastguard Worker mErrorCode = status;
241*38e8c45fSAndroid Build Coastguard Worker mMessage.clear();
242*38e8c45fSAndroid Build Coastguard Worker }
243*38e8c45fSAndroid Build Coastguard Worker
toString8() const244*38e8c45fSAndroid Build Coastguard Worker String8 Status::toString8() const {
245*38e8c45fSAndroid Build Coastguard Worker String8 ret;
246*38e8c45fSAndroid Build Coastguard Worker if (mException == EX_NONE) {
247*38e8c45fSAndroid Build Coastguard Worker ret.append("No error");
248*38e8c45fSAndroid Build Coastguard Worker } else {
249*38e8c45fSAndroid Build Coastguard Worker ret.appendFormat("Status(%d, %s): '", mException, exceptionToString(mException).c_str());
250*38e8c45fSAndroid Build Coastguard Worker if (mException == EX_SERVICE_SPECIFIC) {
251*38e8c45fSAndroid Build Coastguard Worker ret.appendFormat("%d: ", mErrorCode);
252*38e8c45fSAndroid Build Coastguard Worker } else if (mException == EX_TRANSACTION_FAILED) {
253*38e8c45fSAndroid Build Coastguard Worker ret.appendFormat("%s: ", statusToString(mErrorCode).c_str());
254*38e8c45fSAndroid Build Coastguard Worker }
255*38e8c45fSAndroid Build Coastguard Worker ret.append(String8(mMessage));
256*38e8c45fSAndroid Build Coastguard Worker ret.append("'");
257*38e8c45fSAndroid Build Coastguard Worker }
258*38e8c45fSAndroid Build Coastguard Worker return ret;
259*38e8c45fSAndroid Build Coastguard Worker }
260*38e8c45fSAndroid Build Coastguard Worker
skipUnusedHeader(const Parcel & parcel)261*38e8c45fSAndroid Build Coastguard Worker status_t Status::skipUnusedHeader(const Parcel& parcel) {
262*38e8c45fSAndroid Build Coastguard Worker // Note that the header size includes the 4 byte size field.
263*38e8c45fSAndroid Build Coastguard Worker const size_t header_start = parcel.dataPosition();
264*38e8c45fSAndroid Build Coastguard Worker // Get available size before reading more
265*38e8c45fSAndroid Build Coastguard Worker const size_t header_avail = parcel.dataAvail();
266*38e8c45fSAndroid Build Coastguard Worker
267*38e8c45fSAndroid Build Coastguard Worker int32_t header_size;
268*38e8c45fSAndroid Build Coastguard Worker status_t status = parcel.readInt32(&header_size);
269*38e8c45fSAndroid Build Coastguard Worker ALOGD("Skip unused header. exception code: %d, start: %zu, size: %d.",
270*38e8c45fSAndroid Build Coastguard Worker mException, header_start, header_size);
271*38e8c45fSAndroid Build Coastguard Worker if (status != OK) {
272*38e8c45fSAndroid Build Coastguard Worker return status;
273*38e8c45fSAndroid Build Coastguard Worker }
274*38e8c45fSAndroid Build Coastguard Worker
275*38e8c45fSAndroid Build Coastguard Worker if (header_size < 0 || static_cast<size_t>(header_size) > header_avail) {
276*38e8c45fSAndroid Build Coastguard Worker android_errorWriteLog(0x534e4554, "132650049");
277*38e8c45fSAndroid Build Coastguard Worker return UNKNOWN_ERROR;
278*38e8c45fSAndroid Build Coastguard Worker }
279*38e8c45fSAndroid Build Coastguard Worker
280*38e8c45fSAndroid Build Coastguard Worker parcel.setDataPosition(header_start + header_size);
281*38e8c45fSAndroid Build Coastguard Worker return OK;
282*38e8c45fSAndroid Build Coastguard Worker }
283*38e8c45fSAndroid Build Coastguard Worker
284*38e8c45fSAndroid Build Coastguard Worker } // namespace binder
285*38e8c45fSAndroid Build Coastguard Worker } // namespace android
286