xref: /aosp_15_r20/frameworks/native/libs/binder/Status.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
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