• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }