1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "c_parcel_internal.h"
17
18 #include <securec.h>
19 #include <string_ex.h>
20 #include "c_remote_object_internal.h"
21 #include "log_tags.h"
22 #include "ipc_debug.h"
23
24 using namespace OHOS;
25 static constexpr OHOS::HiviewDFX::HiLogLabel LOG_LABEL = { LOG_CORE, LOG_ID_IPC, "CParcel" };
26
MessageParcelHolder(OHOS::MessageParcel * parcel)27 MessageParcelHolder::MessageParcelHolder(OHOS::MessageParcel *parcel)
28 : isExternal_(true)
29 {
30 if (parcel == nullptr) {
31 parcel_ = new (std::nothrow) MessageParcel();
32 isExternal_ = false;
33 } else {
34 parcel_ = parcel;
35 }
36 }
37
~MessageParcelHolder(void)38 MessageParcelHolder::~MessageParcelHolder(void)
39 {
40 if (!isExternal_ && parcel_ != nullptr) {
41 delete parcel_;
42 }
43 }
44
IsValidParcel(const CParcel * parcel,const char * promot)45 static bool IsValidParcel(const CParcel *parcel, const char *promot)
46 {
47 if (parcel == nullptr) {
48 ZLOGE(LOG_LABEL, "%{public}s: parcel is null\n", promot);
49 return false;
50 }
51 if (parcel->parcel_ == nullptr) {
52 ZLOGE(LOG_LABEL, "%{public}s: wrapper parcel is null\n", promot);
53 return false;
54 }
55 return true;
56 }
57
WriteAndCheckArrayLength(CParcel * parcel,bool isNull,int32_t len)58 static bool WriteAndCheckArrayLength(CParcel *parcel, bool isNull, int32_t len)
59 {
60 if (len < -1) {
61 return false;
62 }
63 if (!isNull && len < 0) {
64 ZLOGE(LOG_LABEL, "%{public}s: not null array has invalid length: %d\n", __func__, len);
65 return false;
66 }
67 if (isNull && len > 0) {
68 ZLOGE(LOG_LABEL, "%{public}s: null array has invalid length: %d\n", __func__, len);
69 return false;
70 }
71 return parcel->parcel_->WriteInt32(len);
72 }
73
ReadAndCheckArrayLength(const CParcel * parcel,int32_t & len)74 static bool ReadAndCheckArrayLength(const CParcel *parcel, int32_t &len)
75 {
76 if (!parcel->parcel_->ReadInt32(len)) {
77 ZLOGE(LOG_LABEL, "%{public}s: read array length from native parcel failed\n", __func__);
78 return false;
79 }
80 if (len < -1) {
81 ZLOGE(LOG_LABEL, "%{public}s: length is invalid: %d\n", __func__, len);
82 return false;
83 }
84 if (len <= 0) { // null array
85 return true;
86 }
87 if (static_cast<uint32_t>(len) > parcel->parcel_->GetReadableBytes()) {
88 ZLOGE(LOG_LABEL, "%{public}s: readable bytes are too short in parcel: %d\n", __func__, len);
89 return false;
90 }
91 return true;
92 }
93
CParcelObtain(void)94 CParcel *CParcelObtain(void)
95 {
96 CParcel *holder = new (std::nothrow) MessageParcelHolder();
97 if (holder == nullptr) {
98 ZLOGE(LOG_LABEL, "%{public}s: malloc messsage parcel holder failed\n", __func__);
99 return nullptr;
100 }
101 holder->IncStrongRef(nullptr);
102 return holder;
103 }
104
CParcelIncStrongRef(CParcel * parcel)105 void CParcelIncStrongRef(CParcel *parcel)
106 {
107 if (parcel == nullptr) {
108 ZLOGE(LOG_LABEL, "%{public}s: parcel is nullptr\n", __func__);
109 return;
110 }
111 parcel->IncStrongRef(nullptr);
112 }
113
CParcelDecStrongRef(CParcel * parcel)114 void CParcelDecStrongRef(CParcel *parcel)
115 {
116 if (parcel == nullptr) {
117 ZLOGE(LOG_LABEL, "%{public}s: parcel is nullptr\n", __func__);
118 return;
119 }
120 parcel->DecStrongRef(nullptr);
121 }
122
CParcelWriteBool(CParcel * parcel,bool value)123 bool CParcelWriteBool(CParcel *parcel, bool value)
124 {
125 if (!IsValidParcel(parcel, __func__)) {
126 return false;
127 }
128 return parcel->parcel_->WriteBool(value);
129 }
130
CParcelReadBool(const CParcel * parcel,bool * value)131 bool CParcelReadBool(const CParcel *parcel, bool *value)
132 {
133 if (!IsValidParcel(parcel, __func__) || value == nullptr) {
134 return false;
135 }
136 return parcel->parcel_->ReadBool(*value);
137 }
138
CParcelWriteInt8(CParcel * parcel,int8_t value)139 bool CParcelWriteInt8(CParcel *parcel, int8_t value)
140 {
141 if (!IsValidParcel(parcel, __func__)) {
142 return false;
143 }
144 return parcel->parcel_->WriteInt8(value);
145 }
146
CParcelReadInt8(const CParcel * parcel,int8_t * value)147 bool CParcelReadInt8(const CParcel *parcel, int8_t *value)
148 {
149 if (!IsValidParcel(parcel, __func__) || value == nullptr) {
150 return false;
151 }
152 return parcel->parcel_->ReadInt8(*value);
153 }
154
CParcelWriteInt16(CParcel * parcel,int16_t value)155 bool CParcelWriteInt16(CParcel *parcel, int16_t value)
156 {
157 if (!IsValidParcel(parcel, __func__)) {
158 return false;
159 }
160 return parcel->parcel_->WriteInt16(value);
161 }
162
CParcelReadInt16(const CParcel * parcel,int16_t * value)163 bool CParcelReadInt16(const CParcel *parcel, int16_t *value)
164 {
165 if (!IsValidParcel(parcel, __func__) || value == nullptr) {
166 return false;
167 }
168 return parcel->parcel_->ReadInt16(*value);
169 }
170
CParcelWriteInt32(CParcel * parcel,int32_t value)171 bool CParcelWriteInt32(CParcel *parcel, int32_t value)
172 {
173 if (!IsValidParcel(parcel, __func__)) {
174 return false;
175 }
176 return parcel->parcel_->WriteInt32(value);
177 }
178
CParcelReadInt32(const CParcel * parcel,int32_t * value)179 bool CParcelReadInt32(const CParcel *parcel, int32_t *value)
180 {
181 if (!IsValidParcel(parcel, __func__) || value == nullptr) {
182 return false;
183 }
184 return parcel->parcel_->ReadInt32(*value);
185 }
186
CParcelWriteInt64(CParcel * parcel,int64_t value)187 bool CParcelWriteInt64(CParcel *parcel, int64_t value)
188 {
189 if (!IsValidParcel(parcel, __func__)) {
190 return false;
191 }
192 return parcel->parcel_->WriteInt64(value);
193 }
194
CParcelReadInt64(const CParcel * parcel,int64_t * value)195 bool CParcelReadInt64(const CParcel *parcel, int64_t *value)
196 {
197 if (!IsValidParcel(parcel, __func__) || value == nullptr) {
198 return false;
199 }
200 return parcel->parcel_->ReadInt64(*value);
201 }
202
CParcelWriteFloat(CParcel * parcel,float value)203 bool CParcelWriteFloat(CParcel *parcel, float value)
204 {
205 if (!IsValidParcel(parcel, __func__)) {
206 return false;
207 }
208 return parcel->parcel_->WriteFloat(value);
209 }
210
CParcelReadFloat(const CParcel * parcel,float * value)211 bool CParcelReadFloat(const CParcel *parcel, float *value)
212 {
213 if (!IsValidParcel(parcel, __func__) || value == nullptr) {
214 return false;
215 }
216 return parcel->parcel_->ReadFloat(*value);
217 }
218
CParcelWriteDouble(CParcel * parcel,double value)219 bool CParcelWriteDouble(CParcel *parcel, double value)
220 {
221 if (!IsValidParcel(parcel, __func__)) {
222 return false;
223 }
224 return parcel->parcel_->WriteDouble(value);
225 }
226
CParcelReadDouble(const CParcel * parcel,double * value)227 bool CParcelReadDouble(const CParcel *parcel, double *value)
228 {
229 if (!IsValidParcel(parcel, __func__) || value == nullptr) {
230 return false;
231 }
232 return parcel->parcel_->ReadDouble(*value);
233 }
234
CParcelWriteString(CParcel * parcel,const char * stringData,int32_t length)235 bool CParcelWriteString(CParcel *parcel, const char *stringData, int32_t length)
236 {
237 if (!IsValidParcel(parcel, __func__)) {
238 return false;
239 }
240 if (stringData == nullptr) {
241 if (length != -1) {
242 ZLOGE(LOG_LABEL, "%{public}s: stringData is null, len: %d\n", __func__, length);
243 return false;
244 }
245 std::string value;
246 return parcel->parcel_->WriteString(value);
247 }
248 if (length < 0) {
249 ZLOGE(LOG_LABEL, "%{public}s: stringData len is invalid: %d\n", __func__, length);
250 return false;
251 }
252 std::string value(stringData, length);
253 return parcel->parcel_->WriteString(value);
254 }
255
CParcelReadString(const CParcel * parcel,void * stringData,OnCParcelBytesAllocator allocator)256 bool CParcelReadString(const CParcel *parcel, void *stringData, OnCParcelBytesAllocator allocator)
257 {
258 if (!IsValidParcel(parcel, __func__) || allocator == nullptr) {
259 return false;
260 }
261 std::string value;
262 if (!parcel->parcel_->ReadString(value)) {
263 ZLOGE(LOG_LABEL, "%{public}s: read string from parcel failed\n", __func__);
264 return false;
265 }
266 char *buffer = nullptr;
267 bool isSuccess = allocator(stringData, &buffer, value.length());
268 if (!isSuccess) {
269 ZLOGE(LOG_LABEL, "%{public}s: allocate string buffer is null\n", __func__);
270 return false;
271 }
272 if (value.length() > 0 && memcpy_s(buffer, value.length(), value.data(), value.length()) != EOK) {
273 ZLOGE(LOG_LABEL, "%{public}s: memcpy string failed\n", __func__);
274 return false;
275 }
276 return true;
277 }
278
CParcelWriteString16(CParcel * parcel,const char * str,int32_t strLen)279 bool CParcelWriteString16(CParcel *parcel, const char *str, int32_t strLen)
280 {
281 if (!IsValidParcel(parcel, __func__)) {
282 return false;
283 }
284 if (str == nullptr) {
285 if (strLen != -1) {
286 ZLOGE(LOG_LABEL, "%{public}s: str is null, len: %d\n", __func__, strLen);
287 return false;
288 }
289 std::u16string value;
290 return parcel->parcel_->WriteString16(value);
291 }
292 if (strLen < 0) {
293 ZLOGE(LOG_LABEL, "%{public}s: str len is invalid: %d\n", __func__, strLen);
294 return false;
295 }
296 std::u16string u16string = Str8ToStr16(std::string(str, strLen));
297 if (u16string.length() == 0 && strLen != 0) {
298 ZLOGE(LOG_LABEL, "%{public}s: convert u16string failed: %d\n", __func__, strLen);
299 return false;
300 }
301 return parcel->parcel_->WriteString16(u16string);
302 }
303
CParcelReadString16(const CParcel * parcel,void * stringData,OnCParcelBytesAllocator allocator)304 bool CParcelReadString16(const CParcel *parcel, void *stringData, OnCParcelBytesAllocator allocator)
305 {
306 if (!IsValidParcel(parcel, __func__) || allocator == nullptr) {
307 return false;
308 }
309 std::u16string u16string;
310 if (!parcel->parcel_->ReadString16(u16string)) {
311 ZLOGE(LOG_LABEL, "%{public}s: read u16string from parcel failed\n", __func__);
312 return false;
313 }
314 std::string value = Str16ToStr8(u16string);
315 if (u16string.length() != 0 && value.length() == 0) {
316 ZLOGE(LOG_LABEL, "%{public}s: u16string len: %u, string len: %u\n", __func__,
317 static_cast<uint32_t>(u16string.length()), static_cast<uint32_t>(value.length()));
318 return false;
319 }
320 char *buffer = nullptr;
321 bool isSuccess = allocator(stringData, &buffer, value.length());
322 if (!isSuccess) {
323 ZLOGE(LOG_LABEL, "%{public}s: allocate string buffer is null\n", __func__);
324 return false;
325 }
326 if (value.length() > 0 && memcpy_s(buffer, value.length(), value.data(), value.length()) != EOK) {
327 ZLOGE(LOG_LABEL, "%{public}s: memcpy string16 failed\n", __func__);
328 return false;
329 }
330 return true;
331 }
332
CParcelWriteInterfaceToken(CParcel * parcel,const char * token,int32_t tokenLen)333 bool CParcelWriteInterfaceToken(CParcel *parcel, const char *token, int32_t tokenLen)
334 {
335 if (!IsValidParcel(parcel, __func__)) {
336 return false;
337 }
338 if (token == nullptr || tokenLen < 0) {
339 ZLOGE(LOG_LABEL, "%{public}s: token len is invalid: %d\n", __func__, tokenLen);
340 return false;
341 }
342 std::u16string u16string = Str8ToStr16(std::string(token, tokenLen));
343 if (u16string.length() == 0 && tokenLen != 0) {
344 ZLOGE(LOG_LABEL, "%{public}s: convert token to u16string failed: %d\n", __func__, tokenLen);
345 return false;
346 }
347 return parcel->parcel_->WriteInterfaceToken(u16string);
348 }
349
CParcelReadInterfaceToken(const CParcel * parcel,void * token,OnCParcelBytesAllocator allocator)350 bool CParcelReadInterfaceToken(const CParcel *parcel, void *token, OnCParcelBytesAllocator allocator)
351 {
352 if (!IsValidParcel(parcel, __func__) || allocator == nullptr) {
353 return false;
354 }
355 std::u16string u16string = parcel->parcel_->ReadInterfaceToken();
356 std::string value = Str16ToStr8(u16string);
357 if (u16string.length() != 0 && value.length() == 0) {
358 ZLOGE(LOG_LABEL, "%{public}s: u16string len: %u, string len: %u\n", __func__,
359 static_cast<uint32_t>(u16string.length()), static_cast<uint32_t>(value.length()));
360 return false;
361 }
362 char *buffer = nullptr;
363 bool isSuccess = allocator(token, &buffer, value.length());
364 if (!isSuccess) {
365 ZLOGE(LOG_LABEL, "%{public}s: allocate interface token buffer failed\n", __func__);
366 return false;
367 }
368 if (value.length() > 0 && memcpy_s(buffer, value.length(), value.data(), value.length()) != EOK) {
369 ZLOGE(LOG_LABEL, "%{public}s: memcpy interface token failed\n", __func__);
370 return false;
371 }
372 return true;
373 }
374
CParcelWriteRemoteObject(CParcel * parcel,const CRemoteObject * object)375 bool CParcelWriteRemoteObject(CParcel *parcel, const CRemoteObject *object)
376 {
377 if (!IsValidParcel(parcel, __func__) || !IsValidRemoteObject(object, __func__)) {
378 return false;
379 }
380 return parcel->parcel_->WriteRemoteObject(object->remote_);
381 }
382
CParcelReadRemoteObject(const CParcel * parcel)383 CRemoteObject *CParcelReadRemoteObject(const CParcel *parcel)
384 {
385 if (!IsValidParcel(parcel, __func__)) {
386 return nullptr;
387 }
388 sptr<IRemoteObject> remote = parcel->parcel_->ReadRemoteObject();
389 if (remote == nullptr) {
390 ZLOGE(LOG_LABEL, "%{public}s: read remote object is null\n", __func__);
391 return nullptr;
392 }
393 CRemoteObject *holder = nullptr;
394 holder = new (std::nothrow) CRemoteObjectHolder();
395 if (holder == nullptr) {
396 ZLOGE(LOG_LABEL, "%{public}s: craete remote object holder failed\n", __func__);
397 return nullptr;
398 }
399 holder->remote_ = remote;
400 holder->IncStrongRef(nullptr);
401 return holder;
402 }
403
CParcelWriteFileDescriptor(CParcel * parcel,int32_t fd)404 bool CParcelWriteFileDescriptor(CParcel *parcel, int32_t fd)
405 {
406 if (!IsValidParcel(parcel, __func__)) {
407 return false;
408 }
409 return parcel->parcel_->WriteFileDescriptor(fd);
410 }
411
CParcelReadFileDescriptor(const CParcel * parcel,int32_t * fd)412 bool CParcelReadFileDescriptor(const CParcel *parcel, int32_t *fd)
413 {
414 if (!IsValidParcel(parcel, __func__)) {
415 return false;
416 }
417 if (fd == nullptr) {
418 ZLOGE(LOG_LABEL, "%{public}s: fd is null\n", __func__);
419 return false;
420 }
421 *fd = parcel->parcel_->ReadFileDescriptor();
422 return (*fd < 0) ? false : true;
423 }
424
CParcelWriteBuffer(CParcel * parcel,const uint8_t * buffer,uint32_t len)425 bool CParcelWriteBuffer(CParcel *parcel, const uint8_t *buffer, uint32_t len)
426 {
427 if (!IsValidParcel(parcel, __func__)) {
428 return false;
429 }
430 if (buffer == nullptr) {
431 ZLOGE(LOG_LABEL, "%{public}s: buffer is null: %d\n", __func__, len);
432 return false;
433 }
434 return parcel->parcel_->WriteBuffer(buffer, len);
435 }
436
CParcelReadBuffer(const CParcel * parcel,uint8_t * value,uint32_t len)437 bool CParcelReadBuffer(const CParcel *parcel, uint8_t *value, uint32_t len)
438 {
439 if (!IsValidParcel(parcel, __func__) || value == nullptr) {
440 return false;
441 }
442 const uint8_t *data = parcel->parcel_->ReadBuffer(len);
443 if (data == nullptr) {
444 ZLOGE(LOG_LABEL, "%{public}s: read buffer failed\n", __func__);
445 return false;
446 }
447 if (len > 0 && memcpy_s(value, len, data, len) != EOK) {
448 ZLOGE(LOG_LABEL, "%{public}s: copy buffer failed\n", __func__);
449 return false;
450 }
451 return true;
452 }
453
CParcelWriteRawData(CParcel * parcel,const uint8_t * buffer,uint32_t len)454 bool CParcelWriteRawData(CParcel *parcel, const uint8_t *buffer, uint32_t len)
455 {
456 if (!IsValidParcel(parcel, __func__)) {
457 return false;
458 }
459 return parcel->parcel_->WriteRawData(buffer, len);
460 }
461
CParcelReadRawData(const CParcel * parcel,uint32_t len)462 const uint8_t *CParcelReadRawData(const CParcel *parcel, uint32_t len)
463 {
464 if (!IsValidParcel(parcel, __func__)) {
465 return nullptr;
466 }
467 const void *data = parcel->parcel_->ReadRawData(len);
468 if (data == nullptr) {
469 ZLOGE(LOG_LABEL, "%{public}s: read raw data from native failed\n", __func__);
470 return nullptr;
471 }
472 return reinterpret_cast<const uint8_t *>(data);
473 }
474
475 template <typename T>
WriteVector(CParcel * parcel,const char * func,const T * array,int32_t len,bool (Parcel::* Write)(const std::vector<T> & val))476 static bool WriteVector(CParcel *parcel, const char *func, const T *array, int32_t len,
477 bool (Parcel::*Write)(const std::vector<T> &val))
478 {
479 if (!IsValidParcel(parcel, func) || (array == nullptr && len > 0)) {
480 return false;
481 }
482 std::vector<T> value(array, array + len);
483 return (parcel->parcel_->*Write)(value);
484 }
485
486 template <typename T>
ReadVector(const CParcel * parcel,const char * func,void * value,bool (* OnCParcelTypeAllocator)(void * value,T ** buffer,int32_t len),bool (Parcel::* Read)(std::vector<T> * val))487 static bool ReadVector(const CParcel *parcel, const char *func, void *value,
488 bool (*OnCParcelTypeAllocator)(void *value, T **buffer, int32_t len),
489 bool (Parcel::*Read)(std::vector<T> *val))
490 {
491 if (!IsValidParcel(parcel, func) || OnCParcelTypeAllocator == nullptr) {
492 return false;
493 }
494 std::vector<T> array;
495 if (!(parcel->parcel_->*Read)(&array)) {
496 ZLOGE(LOG_LABEL, "%{public}s: read type vector from native failed\n", func);
497 return false;
498 }
499 T *buffer = nullptr;
500 bool isSuccess = OnCParcelTypeAllocator(value, &buffer, array.size());
501 if (!isSuccess) {
502 ZLOGE(LOG_LABEL, "%{public}s: allocate type array buffer failed\n", func);
503 return false;
504 }
505 int32_t len = array.size() * sizeof(T);
506 if (array.size() > 0 && memcpy_s(buffer, len, array.data(), len) != EOK) {
507 ZLOGE(LOG_LABEL, "%{public}s: memcpy type buffer failed\n", func);
508 return false;
509 }
510 return true;
511 }
512
CParcelWriteBoolArray(CParcel * parcel,const bool * array,int32_t len)513 bool CParcelWriteBoolArray(CParcel *parcel, const bool *array, int32_t len)
514 {
515 return WriteVector(parcel, __func__, array, len, &Parcel::WriteBoolVector);
516 }
517
CParcelReadBoolArray(const CParcel * parcel,void * value,OnCParcelBoolAllocator allocator)518 bool CParcelReadBoolArray(const CParcel *parcel, void *value, OnCParcelBoolAllocator allocator)
519 {
520 if (!IsValidParcel(parcel, __func__) || allocator == nullptr) {
521 return false;
522 }
523 std::vector<bool> array;
524 if (!parcel->parcel_->ReadBoolVector(&array)) {
525 ZLOGE(LOG_LABEL, "%{public}s: read bool vector from native failed\n", __func__);
526 return false;
527 }
528 bool *buffer = nullptr;
529 bool isSuccess = allocator(value, &buffer, array.size());
530 if (!isSuccess) {
531 ZLOGE(LOG_LABEL, "%{public}s: allocate bool array buffer failed\n", __func__);
532 return false;
533 }
534 if (array.size() > 0) {
535 for (size_t i = 0; i < array.size(); ++i) {
536 buffer[i] = array[i];
537 }
538 }
539 return true;
540 }
541
CParcelWriteInt8Array(CParcel * parcel,const int8_t * array,int32_t len)542 bool CParcelWriteInt8Array(CParcel *parcel, const int8_t *array, int32_t len)
543 {
544 return WriteVector(parcel, __func__, array, len, &Parcel::WriteInt8Vector);
545 }
546
CParcelReadInt8Array(const CParcel * parcel,void * value,OnCParcelInt8Allocator allocator)547 bool CParcelReadInt8Array(const CParcel *parcel, void *value, OnCParcelInt8Allocator allocator)
548 {
549 return ReadVector(parcel, __func__, value, allocator, &Parcel::ReadInt8Vector);
550 }
551
CParcelWriteInt16Array(CParcel * parcel,const int16_t * array,int32_t len)552 bool CParcelWriteInt16Array(CParcel *parcel, const int16_t *array, int32_t len)
553 {
554 return WriteVector(parcel, __func__, array, len, &Parcel::WriteInt16Vector);
555 }
556
CParcelReadInt16Array(const CParcel * parcel,void * value,OnCParcelInt16Allocator allocator)557 bool CParcelReadInt16Array(const CParcel *parcel, void *value, OnCParcelInt16Allocator allocator)
558 {
559 return ReadVector(parcel, __func__, value, allocator, &Parcel::ReadInt16Vector);
560 }
561
CParcelWriteInt32Array(CParcel * parcel,const int32_t * array,int32_t len)562 bool CParcelWriteInt32Array(CParcel *parcel, const int32_t *array, int32_t len)
563 {
564 return WriteVector(parcel, __func__, array, len, &Parcel::WriteInt32Vector);
565 }
566
CParcelReadInt32Array(const CParcel * parcel,void * value,OnCParcelInt32Allocator allocator)567 bool CParcelReadInt32Array(const CParcel *parcel, void *value, OnCParcelInt32Allocator allocator)
568 {
569 return ReadVector(parcel, __func__, value, allocator, &Parcel::ReadInt32Vector);
570 }
571
CParcelWriteInt64Array(CParcel * parcel,const int64_t * array,int32_t len)572 bool CParcelWriteInt64Array(CParcel *parcel, const int64_t *array, int32_t len)
573 {
574 return WriteVector(parcel, __func__, array, len, &Parcel::WriteInt64Vector);
575 }
576
CParcelReadInt64Array(const CParcel * parcel,void * value,OnCParcelInt64Allocator allocator)577 bool CParcelReadInt64Array(const CParcel *parcel, void *value, OnCParcelInt64Allocator allocator)
578 {
579 return ReadVector(parcel, __func__, value, allocator, &Parcel::ReadInt64Vector);
580 }
581
CParcelWriteFloatArray(CParcel * parcel,const float * array,int32_t len)582 bool CParcelWriteFloatArray(CParcel *parcel, const float *array, int32_t len)
583 {
584 return WriteVector(parcel, __func__, array, len, &Parcel::WriteFloatVector);
585 }
586
CParcelReadFloatArray(const CParcel * parcel,void * value,OnCParcelFloatAllocator allocator)587 bool CParcelReadFloatArray(const CParcel *parcel, void *value, OnCParcelFloatAllocator allocator)
588 {
589 return ReadVector(parcel, __func__, value, allocator, &Parcel::ReadFloatVector);
590 }
591
CParcelWriteDoubleArray(CParcel * parcel,const double * array,int32_t len)592 bool CParcelWriteDoubleArray(CParcel *parcel, const double *array, int32_t len)
593 {
594 return WriteVector(parcel, __func__, array, len, &Parcel::WriteDoubleVector);
595 }
596
CParcelReadDoubleArray(const CParcel * parcel,void * value,OnCParcelDoubleAllocator allocator)597 bool CParcelReadDoubleArray(const CParcel *parcel, void *value, OnCParcelDoubleAllocator allocator)
598 {
599 return ReadVector(parcel, __func__, value, allocator, &Parcel::ReadDoubleVector);
600 }
601
CParcelWriteStringArray(CParcel * parcel,const void * value,int32_t len,OnStringArrayWrite writer)602 bool CParcelWriteStringArray(CParcel *parcel, const void *value,
603 int32_t len, OnStringArrayWrite writer)
604 {
605 if (!IsValidParcel(parcel, __func__) || writer == nullptr) {
606 return false;
607 }
608 std::vector<std::string> stringVector;
609 if (len > 0 && !writer(reinterpret_cast<void *>(&stringVector),
610 value, static_cast<uint32_t>(len))) {
611 ZLOGE(LOG_LABEL, "%{public}s: write string array to vector failed\n", __func__);
612 return false;
613 }
614 if (!parcel->parcel_->WriteStringVector(stringVector)) {
615 ZLOGE(LOG_LABEL, "%{public}s: write string array to parcel failed\n", __func__);
616 return false;
617 }
618 return true;
619 }
620
CParcelWriteString16Array(CParcel * parcel,const void * value,int32_t len,OnString16ArrayWrite writer)621 bool CParcelWriteString16Array(CParcel *parcel, const void *value,
622 int32_t len, OnString16ArrayWrite writer)
623 {
624 if (!IsValidParcel(parcel, __func__) || writer == nullptr) {
625 return false;
626 }
627 std::vector<std::u16string> string16Vector;
628 if (len > 0 && !writer(reinterpret_cast<void *>(&string16Vector),
629 value, static_cast<uint32_t>(len))) {
630 ZLOGE(LOG_LABEL, "%{public}s: write u16string array to vector failed\n", __func__);
631 return false;
632 }
633
634 if (!parcel->parcel_->WriteString16Vector(string16Vector)) {
635 ZLOGE(LOG_LABEL, "%{public}s: write u16string array to parcel failed\n", __func__);
636 return false;
637 }
638 return true;
639 }
640
CParcelWriteStringElement(void * data,const char * value,int32_t len)641 bool CParcelWriteStringElement(void *data, const char *value, int32_t len)
642 {
643 std::vector<std::string> *stringVector = reinterpret_cast<std::vector<std::string> *>(data);
644 if (stringVector == nullptr) {
645 ZLOGE(LOG_LABEL, "%{public}s: stringVector is null\n", __func__);
646 return false;
647 }
648 if (len < 0) {
649 ZLOGE(LOG_LABEL, "%{public}s: string len is invalid: %d\n", __func__, len);
650 return false;
651 }
652 stringVector->push_back(std::string(value, len));
653 return true;
654 }
655
CParcelWritU16stringElement(void * data,const char * value,int32_t len)656 bool CParcelWritU16stringElement(void *data, const char *value, int32_t len)
657 {
658 std::vector<std::u16string> *u16stringVector = reinterpret_cast<std::vector<std::u16string> *>(data);
659 if (u16stringVector == nullptr) {
660 ZLOGE(LOG_LABEL, "%{public}s: stringVector is null\n", __func__);
661 return false;
662 }
663 if (len < 0) {
664 ZLOGE(LOG_LABEL, "%{public}s: string len is invalid: %d\n", __func__, len);
665 return false;
666 }
667
668 std::u16string u16str = std::wstring_convert< std::codecvt_utf8_utf16<char16_t>, char16_t >{}.from_bytes(
669 std::string(value, len));
670 u16stringVector->push_back(u16str);
671
672 return true;
673 }
674
CParcelReadStringArray(const CParcel * parcel,void * value,OnStringArrayRead reader)675 bool CParcelReadStringArray(const CParcel *parcel, void *value, OnStringArrayRead reader)
676 {
677 if (!IsValidParcel(parcel, __func__) || reader == nullptr) {
678 return false;
679 }
680 std::vector<std::string> stringVector;
681 if (!parcel->parcel_->ReadStringVector(&stringVector)) {
682 ZLOGE(LOG_LABEL, "%{public}s: read string array from parcel failed\n", __func__);
683 return false;
684 }
685 if (!reader(reinterpret_cast<void *>(&stringVector), value, stringVector.size())) {
686 ZLOGE(LOG_LABEL, "%{public}s: read string to vector failed\n", __func__);
687 return false;
688 }
689 return true;
690 }
691
CParcelReadString16Array(const CParcel * parcel,void * value,OnString16ArrayRead reader)692 bool CParcelReadString16Array(const CParcel *parcel, void *value, OnString16ArrayRead reader)
693 {
694 if (!IsValidParcel(parcel, __func__) || reader == nullptr) {
695 return false;
696 }
697 std::vector<std::u16string> string16Vector;
698 if (!parcel->parcel_->ReadString16Vector(&string16Vector)) {
699 ZLOGE(LOG_LABEL, "%{public}s: read u16string array from parcel failed\n", __func__);
700 return false;
701 }
702 if (!reader(reinterpret_cast<void *>(&string16Vector), value, string16Vector.size())) {
703 ZLOGE(LOG_LABEL, "%{public}s: read u16string to vector failed\n", __func__);
704 return false;
705 }
706 return true;
707 }
708
CParcelReadString16Element(uint32_t index,const void * data,void * value,OnCParcelBytesAllocator16 allocator)709 bool CParcelReadString16Element(uint32_t index, const void *data, void *value,
710 OnCParcelBytesAllocator16 allocator)
711 {
712 if (data == nullptr || allocator == nullptr) {
713 ZLOGE(LOG_LABEL, "%{public}s: invalid data and allocator\n", __func__);
714 return false;
715 }
716 const std::vector<std::u16string> *string16Vector =
717 reinterpret_cast<const std::vector<std::u16string> *>(data);
718
719 if (index >= string16Vector->size()) {
720 ZLOGE(LOG_LABEL, "%{public}s: invalid index: %u, size: %u\n", __func__,
721 index, static_cast<uint32_t>(string16Vector->size()));
722 return false;
723 }
724
725 const std::u16string &string16Value = (*string16Vector)[index];
726 int16_t *buffer = nullptr;
727 bool isSuccess = allocator(value, &buffer, string16Value.length());
728 if (!isSuccess) {
729 ZLOGE(LOG_LABEL, "%{public}s: allocate string16Value buffer failed\n", __func__);
730 return false;
731 }
732
733 if (string16Value.length() > 0 &&
734 memcpy_s(buffer, string16Value.length() * sizeof(char16_t),
735 string16Value.data(), string16Value.length() * sizeof(char16_t)) != EOK) {
736 ZLOGE(LOG_LABEL, "%{public}s: memcpy string16Value failed\n", __func__);
737 return false;
738 }
739 return true;
740 }
741
CParcelReadStringElement(uint32_t index,const void * data,void * value,OnCParcelBytesAllocator allocator)742 bool CParcelReadStringElement(uint32_t index, const void *data, void *value,
743 OnCParcelBytesAllocator allocator)
744 {
745 if (data == nullptr || allocator == nullptr) {
746 ZLOGE(LOG_LABEL, "%{public}s: invalid data and allocator\n", __func__);
747 return false;
748 }
749 const std::vector<std::string> *stringVector =
750 reinterpret_cast<const std::vector<std::string> *>(data);
751 if (index >= stringVector->size()) {
752 ZLOGE(LOG_LABEL, "%{public}s: invalid index: %u, size: %u\n", __func__,
753 index, static_cast<uint32_t>(stringVector->size()));
754 return false;
755 }
756
757 const std::string &stringValue = (*stringVector)[index];
758 char *buffer = nullptr;
759 bool isSuccess = allocator(value, &buffer, stringValue.length());
760 if (!isSuccess) {
761 ZLOGE(LOG_LABEL, "%{public}s: allocate string buffer failed\n", __func__);
762 return false;
763 }
764
765 if (stringValue.length() > 0 &&
766 memcpy_s(buffer, stringValue.length(), stringValue.data(), stringValue.length()) != EOK) {
767 ZLOGE(LOG_LABEL, "%{public}s: memcpy string failed\n", __func__);
768 return false;
769 }
770 return true;
771 }
772
CParcelWriteParcelableArray(CParcel * parcel,const void * value,int32_t len,OnCParcelWriteElement elementWriter)773 bool CParcelWriteParcelableArray(CParcel *parcel, const void *value, int32_t len,
774 OnCParcelWriteElement elementWriter)
775 {
776 if (!IsValidParcel(parcel, __func__) || elementWriter == nullptr) {
777 return false;
778 }
779 size_t pos = parcel->parcel_->GetWritePosition();
780 if (!WriteAndCheckArrayLength(parcel, len < 0, len)) {
781 return false;
782 }
783 for (int32_t i = 0; i < len; ++i) {
784 if (!elementWriter(parcel, value, static_cast<unsigned long>(i))) {
785 ZLOGE(LOG_LABEL, "%{public}s: write parcelable for index: %d failed\n", __func__, i);
786 parcel->parcel_->RewindWrite(pos);
787 return false;
788 }
789 }
790 return true;
791 }
792
CParcelReadParcelableArray(const CParcel * parcel,void * value,OnCParcelAllocator allocator,OnCParcelReadElement elementReader)793 bool CParcelReadParcelableArray(const CParcel *parcel, void *value,
794 OnCParcelAllocator allocator, OnCParcelReadElement elementReader)
795 {
796 if (!IsValidParcel(parcel, __func__) || elementReader == nullptr) {
797 return false;
798 }
799 size_t pos = parcel->parcel_->GetReadPosition();
800 int32_t length;
801 if (!ReadAndCheckArrayLength(parcel, length)) {
802 return false;
803 }
804 if (!allocator(value, length)) {
805 ZLOGE(LOG_LABEL, "%{public}s: allocator failed\n", __func__);
806 return false;
807 }
808 // length == -1 means null array, and will return true
809 for (int32_t i = 0; i < length; ++i) {
810 if (!elementReader(parcel, value, static_cast<unsigned long>(i))) {
811 ZLOGE(LOG_LABEL, "%{public}s: read parcelable for index: %d failed\n", __func__, i);
812 parcel->parcel_->RewindRead(pos);
813 return false;
814 }
815 }
816 return true;
817 }
818
CParcelGetDataSize(const CParcel * parcel)819 uint32_t CParcelGetDataSize(const CParcel *parcel)
820 {
821 if (!IsValidParcel(parcel, __func__)) {
822 return 0;
823 }
824 return parcel->parcel_->GetDataSize();
825 }
826
CParcelSetDataSize(CParcel * parcel,uint32_t new_size)827 bool CParcelSetDataSize(CParcel *parcel, uint32_t new_size)
828 {
829 if (!IsValidParcel(parcel, __func__)) {
830 return 0;
831 }
832 return parcel->parcel_->SetDataSize(new_size);
833 }
834
CParcelGetDataCapacity(const CParcel * parcel)835 uint32_t CParcelGetDataCapacity(const CParcel *parcel)
836 {
837 if (!IsValidParcel(parcel, __func__)) {
838 return 0;
839 }
840 return parcel->parcel_->GetDataCapacity();
841 }
842
CParcelSetDataCapacity(CParcel * parcel,uint32_t new_size)843 bool CParcelSetDataCapacity(CParcel *parcel, uint32_t new_size)
844 {
845 if (!IsValidParcel(parcel, __func__)) {
846 return 0;
847 }
848 return parcel->parcel_->SetDataCapacity(new_size);
849 }
850
CParcelGetMaxCapacity(const CParcel * parcel)851 uint32_t CParcelGetMaxCapacity(const CParcel *parcel)
852 {
853 if (!IsValidParcel(parcel, __func__)) {
854 return 0;
855 }
856 return parcel->parcel_->GetMaxCapacity();
857 }
858
CParcelSetMaxCapacity(CParcel * parcel,uint32_t new_size)859 bool CParcelSetMaxCapacity(CParcel *parcel, uint32_t new_size)
860 {
861 if (!IsValidParcel(parcel, __func__)) {
862 return 0;
863 }
864 return parcel->parcel_->SetMaxCapacity(new_size);
865 }
866
CParcelGetWritableBytes(const CParcel * parcel)867 uint32_t CParcelGetWritableBytes(const CParcel *parcel)
868 {
869 if (!IsValidParcel(parcel, __func__)) {
870 return 0;
871 }
872 return parcel->parcel_->GetWritableBytes();
873 }
874
CParcelGetReadableBytes(const CParcel * parcel)875 uint32_t CParcelGetReadableBytes(const CParcel *parcel)
876 {
877 if (!IsValidParcel(parcel, __func__)) {
878 return 0;
879 }
880 return parcel->parcel_->GetReadableBytes();
881 }
882
CParcelGetReadPosition(const CParcel * parcel)883 uint32_t CParcelGetReadPosition(const CParcel *parcel)
884 {
885 if (!IsValidParcel(parcel, __func__)) {
886 return 0;
887 }
888 return parcel->parcel_->GetReadPosition();
889 }
890
CParcelGetWritePosition(const CParcel * parcel)891 uint32_t CParcelGetWritePosition(const CParcel *parcel)
892 {
893 if (!IsValidParcel(parcel, __func__)) {
894 return 0;
895 }
896 return parcel->parcel_->GetWritePosition();
897 }
898
CParcelRewindRead(CParcel * parcel,uint32_t new_pos)899 bool CParcelRewindRead(CParcel *parcel, uint32_t new_pos)
900 {
901 if (!IsValidParcel(parcel, __func__)) {
902 return 0;
903 }
904 return parcel->parcel_->RewindRead(new_pos);
905 }
906
CParcelRewindWrite(CParcel * parcel,uint32_t new_pos)907 bool CParcelRewindWrite(CParcel *parcel, uint32_t new_pos)
908 {
909 if (!IsValidParcel(parcel, __func__)) {
910 return 0;
911 }
912 return parcel->parcel_->RewindWrite(new_pos);
913 }
914
CParcelWriteAshmem(CParcel * parcel,CAshmem * ashmem)915 bool CParcelWriteAshmem(CParcel *parcel, CAshmem *ashmem)
916 {
917 if (!IsValidParcel(parcel, __func__)) {
918 return false;
919 }
920 return parcel->parcel_->WriteAshmem(ashmem->ashmem_);
921 }
922
CParcelReadAshmem(const CParcel * parcel)923 CAshmem *CParcelReadAshmem(const CParcel *parcel)
924 {
925 if (!IsValidParcel(parcel, __func__)) {
926 return nullptr;
927 }
928 sptr<Ashmem> ashmem = parcel->parcel_->ReadAshmem();
929 if (ashmem == nullptr) {
930 ZLOGE(LOG_LABEL, "%{public}s: read ashmem failed\n", __func__);
931 return nullptr;
932 }
933 CAshmem *cashmem = new (std::nothrow) CAshmem(ashmem);
934 if (cashmem == nullptr) {
935 ZLOGE(LOG_LABEL, "%{public}s: new ashmem failed\n", __func__);
936 return nullptr;
937 }
938 ashmem->IncStrongRef(nullptr);
939 return cashmem;
940 }
941
CParcelContainFileDescriptors(const CParcel * parcel)942 bool CParcelContainFileDescriptors(const CParcel *parcel)
943 {
944 if (!IsValidParcel(parcel, __func__)) {
945 return false;
946 }
947 return parcel->parcel_->ContainFileDescriptors();
948 }
949
CParcelGetRawDataSize(const CParcel * parcel)950 size_t CParcelGetRawDataSize(const CParcel *parcel)
951 {
952 if (!IsValidParcel(parcel, __func__)) {
953 return -1;
954 }
955 return parcel->parcel_->GetRawDataSize();
956 }
957
CParcelGetRawDataCapacity(const CParcel * parcel)958 size_t CParcelGetRawDataCapacity(const CParcel *parcel)
959 {
960 if (!IsValidParcel(parcel, __func__)) {
961 return -1;
962 }
963 return parcel->parcel_->GetRawDataCapacity();
964 }
965
CParcelClearFileDescriptor(CParcel * parcel)966 void CParcelClearFileDescriptor(CParcel *parcel)
967 {
968 if (!IsValidParcel(parcel, __func__)) {
969 return;
970 }
971 parcel->parcel_->ClearFileDescriptor();
972 }
973
CParcelSetClearFdFlag(CParcel * parcel)974 void CParcelSetClearFdFlag(CParcel *parcel)
975 {
976 if (!IsValidParcel(parcel, __func__)) {
977 return;
978 }
979 parcel->parcel_->SetClearFdFlag();
980 }
981
CParcelAppend(CParcel * parcel,CParcel * data)982 bool CParcelAppend(CParcel *parcel, CParcel *data)
983 {
984 if (!IsValidParcel(parcel, __func__)) {
985 return false;
986 }
987 return parcel->parcel_->Append(*(data->parcel_));
988 }