1 /*
2 * Copyright (c) 2021 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 "parcel.h"
17 #include "securec.h"
18 #include "utils_log.h"
19
20 namespace OHOS {
21
22 static const size_t DEFAULT_CPACITY = 204800; // 200K
23 static const size_t CAPACITY_THRESHOLD = 4096; // 4k
24 static const int BINDER_TYPE_HANDLE = 0x73682a85; // binder header type handle
25 static const int BINDER_TYPE_FD = 0x66642a85; // binder header type fd
26
Parcelable()27 Parcelable::Parcelable() : Parcelable(false)
28 {}
29
Parcelable(bool asRemote)30 Parcelable::Parcelable(bool asRemote)
31 {
32 asRemote_ = asRemote;
33 behavior_ = 0;
34 }
35
Parcel(Allocator *allocator)36 Parcel::Parcel(Allocator *allocator)
37 {
38 if (allocator != nullptr) {
39 allocator_ = allocator;
40 } else {
41 allocator_ = new DefaultAllocator();
42 }
43
44 writeCursor_ = 0;
45 readCursor_ = 0;
46
47 data_ = nullptr;
48 dataSize_ = 0;
49 dataCapacity_ = 0;
50
51 maxDataCapacity_ = DEFAULT_CPACITY;
52 objectOffsets_ = nullptr;
53 nextObjectIdx_ = 0;
54 objectCursor_ = 0;
55 objectsCapacity_ = 0;
56 }
57
Parcel()58 Parcel::Parcel() : Parcel(new DefaultAllocator())
59 {}
60
~Parcel()61 Parcel::~Parcel()
62 {
63 FlushBuffer();
64 delete allocator_;
65 allocator_ = nullptr;
66 }
67
GetWritableBytes() const68 size_t Parcel::GetWritableBytes() const
69 {
70 if (dataCapacity_ > writeCursor_) {
71 return dataCapacity_ - writeCursor_;
72 }
73
74 return 0;
75 }
76
GetReadableBytes() const77 size_t Parcel::GetReadableBytes() const
78 {
79 if (dataSize_ > readCursor_) {
80 return dataSize_ - readCursor_;
81 }
82
83 return 0;
84 }
85
CalcNewCapacity(size_t minNewCapacity)86 size_t Parcel::CalcNewCapacity(size_t minNewCapacity)
87 {
88 size_t threshold = CAPACITY_THRESHOLD;
89
90 if (minNewCapacity == threshold) {
91 return threshold;
92 }
93
94 // If over threshold, step by threshold.
95 if (minNewCapacity > threshold) {
96 size_t newCapacity = minNewCapacity / threshold * threshold;
97
98 if ((maxDataCapacity_ > 0) && (newCapacity > maxDataCapacity_ - threshold)) {
99 newCapacity = maxDataCapacity_;
100 } else {
101 newCapacity += threshold;
102 }
103
104 return newCapacity;
105 }
106
107 // Not over threshold. Double it.
108 size_t newCapacity = 64;
109
110 while (newCapacity < minNewCapacity) {
111 // resize capacity by 2 times
112 newCapacity = newCapacity * 2;
113 }
114
115 if ((maxDataCapacity_ > 0) && (newCapacity > maxDataCapacity_)) {
116 newCapacity = maxDataCapacity_;
117 }
118
119 return newCapacity;
120 }
121
EnsureWritableCapacity(size_t desireCapacity)122 bool Parcel::EnsureWritableCapacity(size_t desireCapacity)
123 {
124 if (!writable_) {
125 UTILS_LOGW("this parcel data is alloc by driver, which is can not be writen");
126 return false;
127 }
128 if (desireCapacity <= GetWritableBytes()) {
129 if (data_ == nullptr) {
130 UTILS_LOGE("data_ is nullptr when capacity is available");
131 return false;
132 }
133 return true;
134 }
135
136 size_t minNewCapacity = desireCapacity + writeCursor_;
137 size_t newCapacity = CalcNewCapacity(minNewCapacity);
138 if ((newCapacity <= dataCapacity_) || (newCapacity < minNewCapacity)) {
139 UTILS_LOGW("Failed to ensure parcel capacity, newCapacity = %{public}zu, dataCapacity_ = %{public}zu, "
140 "minNewCapacity = %{public}zu",
141 newCapacity, dataCapacity_, minNewCapacity);
142 return false;
143 }
144
145 if (allocator_ != nullptr) {
146 void *newData = allocator_->Realloc(data_, newCapacity);
147 if (newData != nullptr) {
148 data_ = reinterpret_cast<uint8_t *>(newData);
149 dataCapacity_ = newCapacity;
150 return true;
151 }
152 UTILS_LOGW("Failed to realloc parcel capacity, newCapacity = %{public}zu, dataCapacity_ = %{public}zu",
153 newCapacity, dataCapacity_);
154 }
155
156 return false;
157 }
158
IsReadObjectData(const size_t nextObj, const size_t upperBound)159 bool Parcel::IsReadObjectData(const size_t nextObj, const size_t upperBound)
160 {
161 binder_size_t *objects = objectOffsets_;
162 auto offset = objects[nextObj];
163 auto currentObject = reinterpret_cast<parcel_flat_binder_object *>(data_ + offset);
164 if (currentObject->hdr.type == BINDER_TYPE_FD || currentObject->hdr.type == BINDER_TYPE_HANDLE) {
165 return true;
166 }
167 UTILS_LOGE("Non-object Read object data, readPos = %{public}zu, upperBound = %{public}zu", readCursor_, upperBound);
168 return false;
169 }
170
171 // ValidateReadData only works in basic type read. It doesn't work when read remote object.
172 // And read/write remote object has no effect on "nextObjectIdx_".
ValidateReadData([[maybe_unused]]size_t upperBound)173 bool Parcel::ValidateReadData([[maybe_unused]]size_t upperBound)
174 {
175 #ifdef PARCEL_OBJECT_CHECK
176 if (objectOffsets_ == nullptr || objectCursor_ == 0) {
177 return true;
178 }
179 size_t readPos = readCursor_;
180 size_t objSize = objectCursor_;
181 binder_size_t *objects = objectOffsets_;
182 if (nextObjectIdx_ < objSize && upperBound > objects[nextObjectIdx_]) {
183 size_t nextObj = nextObjectIdx_;
184 do {
185 if (readPos < objects[nextObj] + sizeof(parcel_flat_binder_object)) {
186 if (!IsReadObjectData(nextObj, upperBound)) {
187 return false;
188 }
189 }
190 nextObj++;
191 } while (nextObj < objSize && upperBound > objects[nextObj]);
192 nextObjectIdx_ = nextObj;
193 }
194 #endif
195 return true;
196 }
197
GetDataSize() const198 size_t Parcel::GetDataSize() const
199 {
200 return dataSize_;
201 }
202
GetData() const203 uintptr_t Parcel::GetData() const
204 {
205 return reinterpret_cast<uintptr_t>(data_);
206 }
207
GetObjectOffsets() const208 binder_size_t Parcel::GetObjectOffsets() const
209 {
210 return reinterpret_cast<binder_size_t>(objectOffsets_);
211 }
212
GetOffsetsSize() const213 size_t Parcel::GetOffsetsSize() const
214 {
215 return objectCursor_;
216 }
217
GetDataCapacity() const218 size_t Parcel::GetDataCapacity() const
219 {
220 return dataCapacity_;
221 }
222
GetMaxCapacity() const223 size_t Parcel::GetMaxCapacity() const
224 {
225 return maxDataCapacity_;
226 }
227
SetMaxCapacity(size_t maxCapacity)228 bool Parcel::SetMaxCapacity(size_t maxCapacity)
229 {
230 if (maxCapacity > maxDataCapacity_) {
231 maxDataCapacity_ = maxCapacity;
232 return true;
233 }
234
235 return false;
236 }
237
SetAllocator(Allocator *allocator)238 bool Parcel::SetAllocator(Allocator *allocator)
239 {
240 if ((allocator == nullptr) || (allocator_ == allocator)) {
241 return false;
242 }
243
244 if ((data_ != nullptr) && (dataSize_ > 0)) {
245 if (allocator_ == nullptr) {
246 return false;
247 }
248
249 void *newData = allocator->Alloc(dataSize_);
250 if (newData == nullptr) {
251 UTILS_LOGE("Failed to alloc parcel size, dataSize_ = %{public}zu", dataSize_);
252 return false;
253 }
254
255 if (memcpy_s(newData, dataSize_, data_, dataSize_) != EOK) {
256 allocator->Dealloc(newData);
257 return false;
258 }
259 allocator_->Dealloc(data_);
260 data_ = reinterpret_cast<uint8_t *>(newData);
261 dataCapacity_ = dataSize_;
262 }
263
264 delete allocator_;
265 allocator_ = allocator;
266 return true;
267 }
268
CheckOffsets()269 bool Parcel::CheckOffsets()
270 {
271 size_t readPos = readCursor_;
272 if ((readPos + sizeof(parcel_flat_binder_object)) > dataSize_) {
273 UTILS_LOGD("CheckOffsets Invalid obj, obj size overflow. objSize:%{public}zu, dataSize:%{public}zu",
274 readPos + sizeof(parcel_flat_binder_object), dataSize_);
275 return false;
276 }
277
278 size_t objSize = objectCursor_;
279 binder_size_t *objects = objectOffsets_;
280 size_t objCount = 0;
281 while (objCount < objSize) {
282 if (objects[objCount] == readPos) {
283 return true;
284 }
285 objCount++;
286 }
287 UTILS_LOGW("CheckOffsets Invalid obj: obj not found.");
288 return false;
289 }
290
InjectOffsets(binder_size_t offsets, size_t offsetSize)291 void Parcel::InjectOffsets(binder_size_t offsets, size_t offsetSize)
292 {
293 if (offsetSize <= 0) {
294 return;
295 }
296
297 auto *newObjectOffsets = reinterpret_cast<binder_size_t *>(offsets);
298 for (size_t index = 0; index < offsetSize; index++) {
299 if (EnsureObjectsCapacity()) {
300 WriteObjectOffset(newObjectOffsets[index]);
301 }
302 }
303 }
304
ClearObjects()305 void Parcel::ClearObjects()
306 {
307 objectHolder_.clear();
308 free(objectOffsets_);
309 nextObjectIdx_ = 0;
310 objectCursor_ = 0;
311 objectOffsets_ = nullptr;
312 objectsCapacity_ = 0;
313 }
314
FlushBuffer()315 void Parcel::FlushBuffer()
316 {
317 if (allocator_ == nullptr) {
318 return;
319 }
320
321 if (data_ != nullptr) {
322 allocator_->Dealloc(data_);
323 dataSize_ = 0;
324 writeCursor_ = 0;
325 readCursor_ = 0;
326 dataCapacity_ = 0;
327 data_ = nullptr;
328 }
329
330 if (objectOffsets_) {
331 ClearObjects();
332 }
333 }
334
SetDataCapacity(size_t newCapacity)335 bool Parcel::SetDataCapacity(size_t newCapacity)
336 {
337 if (allocator_ == nullptr || dataSize_ >= newCapacity) {
338 return false;
339 }
340
341 void *newData = allocator_->Realloc(data_, newCapacity);
342 if (newData != nullptr) {
343 data_ = reinterpret_cast<uint8_t *>(newData);
344 dataCapacity_ = newCapacity;
345 return true;
346 }
347 return false;
348 }
349
SetDataSize(size_t dataSize)350 bool Parcel::SetDataSize(size_t dataSize)
351 {
352 if (dataSize > dataCapacity_) {
353 return false;
354 }
355
356 dataSize_ = dataSize;
357 return true;
358 }
359
WriteDataBytes(const void *data, size_t size)360 bool Parcel::WriteDataBytes(const void *data, size_t size)
361 {
362 void *dest = data_ + writeCursor_;
363 size_t writableBytes = GetWritableBytes();
364 if (memcpy_s(dest, writableBytes, data, size) != EOK) {
365 return false;
366 }
367 writeCursor_ += size;
368 dataSize_ += size;
369 return true;
370 }
371
WritePadBytes(size_t padSize)372 void Parcel::WritePadBytes(size_t padSize)
373 {
374 uint8_t *dest = data_ + writeCursor_;
375 static const int MAX_MASK_NUM = 4;
376 #if __BYTE_ORDER == __LITTLE_ENDIAN
377 static const size_t mask[MAX_MASK_NUM] = { 0xFFFFFFFF, 0x00ffffff, 0x0000ffff, 0x000000ff };
378 #else
379 static const size_t mask[MAX_MASK_NUM] = { 0xFFFFFFFF, 0xffffff00, 0xffff0000, 0xff000000 };
380 #endif
381 *reinterpret_cast<uint32_t *>(dest + padSize - MAX_MASK_NUM) &= mask[padSize];
382 writeCursor_ += padSize;
383 dataSize_ += padSize;
384 }
385
WriteBuffer(const void *data, size_t size)386 bool Parcel::WriteBuffer(const void *data, size_t size)
387 {
388 if (data == nullptr || size == 0) {
389 return false;
390 }
391
392 size_t padSize = GetPadSize(size);
393 size_t desireCapacity = size + padSize;
394
395 // in case of desireCapacity overflow
396 if (desireCapacity < size || desireCapacity < padSize) {
397 return false;
398 }
399
400 if (EnsureWritableCapacity(desireCapacity)) {
401 if (!WriteDataBytes(data, size)) {
402 return false;
403 }
404 WritePadBytes(padSize);
405 return true;
406 }
407
408 return false;
409 }
410
WriteBufferAddTerminator(const void *data, size_t size, size_t typeSize)411 bool Parcel::WriteBufferAddTerminator(const void *data, size_t size, size_t typeSize)
412 {
413 if (data == nullptr || size < typeSize) {
414 return false;
415 }
416
417 size_t padSize = GetPadSize(size);
418 size_t desireCapacity = size + padSize;
419
420 // in case of desireCapacity overflow
421 if (desireCapacity < size || desireCapacity < padSize) {
422 return false;
423 }
424
425 if (EnsureWritableCapacity(desireCapacity)) {
426 if (!WriteDataBytes(data, size - typeSize)) {
427 return false;
428 }
429
430 // Reserved for 32 bits
431 const char terminator[] = {0, 0, 0, 0};
432 if (!WriteDataBytes(terminator, typeSize)) {
433 return false;
434 }
435 WritePadBytes(padSize);
436 return true;
437 }
438
439 return false;
440 }
441
WriteUnpadBuffer(const void *data, size_t size)442 bool Parcel::WriteUnpadBuffer(const void *data, size_t size)
443 {
444 return WriteBuffer(data, size);
445 }
446
447 template <typename T>
Write(T value)448 bool Parcel::Write(T value)
449 {
450 size_t desireCapacity = sizeof(T);
451
452 if (EnsureWritableCapacity(desireCapacity)) {
453 *reinterpret_cast<T *>(data_ + writeCursor_) = value;
454 writeCursor_ += desireCapacity;
455 dataSize_ += desireCapacity;
456 return true;
457 }
458
459 return false;
460 }
461
WriteBool(bool value)462 bool Parcel::WriteBool(bool value)
463 {
464 return Write<int32_t>(static_cast<int32_t>(value));
465 }
466
WriteBoolUnaligned(bool value)467 bool Parcel::WriteBoolUnaligned(bool value)
468 {
469 return Write<bool>(value);
470 }
471
WriteInt8(int8_t value)472 bool Parcel::WriteInt8(int8_t value)
473 {
474 return Write<int32_t>(static_cast<int32_t>(value));
475 }
476
WriteInt8Unaligned(int8_t value)477 bool Parcel::WriteInt8Unaligned(int8_t value)
478 {
479 return Write<int8_t>(value);
480 }
481
WriteInt16(int16_t value)482 bool Parcel::WriteInt16(int16_t value)
483 {
484 return Write<int32_t>(static_cast<int32_t>(value));
485 }
486
WriteInt16Unaligned(int16_t value)487 bool Parcel::WriteInt16Unaligned(int16_t value)
488 {
489 return Write<int16_t>(value);
490 }
491
WriteInt32(int32_t value)492 bool Parcel::WriteInt32(int32_t value)
493 {
494 return Write<int32_t>(value);
495 }
496
WriteInt64(int64_t value)497 bool Parcel::WriteInt64(int64_t value)
498 {
499 return Write<int64_t>(value);
500 }
501
WriteUint8(uint8_t value)502 bool Parcel::WriteUint8(uint8_t value)
503 {
504 return Write<uint32_t>(static_cast<uint32_t>(value));
505 }
506
WriteUint8Unaligned(uint8_t value)507 bool Parcel::WriteUint8Unaligned(uint8_t value)
508 {
509 return Write<uint8_t>(value);
510 }
511
WriteUint16(uint16_t value)512 bool Parcel::WriteUint16(uint16_t value)
513 {
514 return Write<uint32_t>(static_cast<uint32_t>(value));
515 }
516
WriteUint16Unaligned(uint16_t value)517 bool Parcel::WriteUint16Unaligned(uint16_t value)
518 {
519 return Write<uint16_t>(value);
520 }
521
WriteUint32(uint32_t value)522 bool Parcel::WriteUint32(uint32_t value)
523 {
524 return Write<uint32_t>(value);
525 }
526
WriteUint64(uint64_t value)527 bool Parcel::WriteUint64(uint64_t value)
528 {
529 return Write<uint64_t>(value);
530 }
531
WriteFloat(float value)532 bool Parcel::WriteFloat(float value)
533 {
534 return Write<float>(value);
535 }
536
WriteDouble(double value)537 bool Parcel::WriteDouble(double value)
538 {
539 return Write<double>(value);
540 }
541
WritePointer(uintptr_t value)542 bool Parcel::WritePointer(uintptr_t value)
543 {
544 return Write<binder_uintptr_t>(value);
545 }
546
WriteCString(const char *value)547 bool Parcel::WriteCString(const char *value)
548 {
549 if (value == nullptr) {
550 return false;
551 }
552 int32_t dataLength = strlen(value);
553 if (dataLength < 0 || dataLength >= INT32_MAX) {
554 return false;
555 }
556 int32_t desireCapacity = (dataLength + 1) * sizeof(char);
557 return WriteBuffer(value, desireCapacity);
558 }
559
WriteString(const std::string &value)560 bool Parcel::WriteString(const std::string &value)
561 {
562 if (value.data() == nullptr) {
563 return WriteInt32(-1);
564 }
565
566 int32_t dataLength = value.length();
567 if (dataLength < 0 || dataLength >= INT32_MAX) {
568 return false;
569 }
570 int32_t typeSize = sizeof(char);
571 int32_t desireCapacity = dataLength + typeSize;
572
573 if (!Write<int32_t>(dataLength)) {
574 return false;
575 }
576
577 return WriteBufferAddTerminator(value.data(), desireCapacity, typeSize);
578 }
579
WriteString16(const std::u16string &value)580 bool Parcel::WriteString16(const std::u16string &value)
581 {
582 if (value.data() == nullptr) {
583 return WriteInt32(-1);
584 }
585
586 int32_t dataLength = value.length();
587 int32_t typeSize = sizeof(char16_t);
588 if (dataLength < 0 || dataLength > ((static_cast<int32_t>(INT32_MAX)) / typeSize - 1)) {
589 return false;
590 }
591 int32_t desireCapacity = (dataLength + 1) * typeSize;
592
593 if (!Write<int32_t>(dataLength)) {
594 return false;
595 }
596
597 return WriteBufferAddTerminator(value.data(), desireCapacity, typeSize);
598 }
599
WriteString16WithLength(const char16_t *value, size_t len)600 bool Parcel::WriteString16WithLength(const char16_t *value, size_t len)
601 {
602 if (!value) {
603 return WriteInt32(-1);
604 }
605
606 int32_t dataLength = len;
607 int32_t typeSize = sizeof(char16_t);
608 if (dataLength < 0 || dataLength > ((static_cast<int32_t>(INT32_MAX)) / typeSize - 1)) {
609 return false;
610 }
611 int32_t desireCapacity = (dataLength + 1) * typeSize;
612 std::u16string u16str(reinterpret_cast<const char16_t *>(value), len);
613
614 if (!Write<int32_t>(dataLength)) {
615 return false;
616 }
617
618 return WriteBufferAddTerminator(u16str.data(), desireCapacity, typeSize);
619 }
620
WriteString8WithLength(const char *value, size_t len)621 bool Parcel::WriteString8WithLength(const char *value, size_t len)
622 {
623 if (!value) {
624 return WriteInt32(-1);
625 }
626
627 int32_t dataLength = len;
628 if (dataLength < 0 || dataLength >= INT32_MAX) {
629 return false;
630 }
631 int32_t typeSize = sizeof(char);
632 int32_t desireCapacity = (dataLength + 1) * typeSize;
633
634 if (!Write<int32_t>(dataLength)) {
635 return false;
636 }
637
638 return WriteBufferAddTerminator(value, desireCapacity, typeSize);
639 }
640
EnsureObjectsCapacity()641 bool Parcel::EnsureObjectsCapacity()
642 {
643 if ((objectsCapacity_ - objectCursor_) >= 1) {
644 return true;
645 }
646
647 if (allocator_ == nullptr) {
648 return false;
649 }
650
651 const int NEW_CAPACITY_ADD = 2;
652 const int NEW_CAPACITY_MULTI = 3;
653 const int NEW_CAPACITY_DIV = 2;
654 size_t newCapacity = ((objectsCapacity_ + NEW_CAPACITY_ADD) * NEW_CAPACITY_MULTI) / NEW_CAPACITY_DIV;
655 size_t newBytes = newCapacity * sizeof(binder_size_t);
656
657 void *newOffsets = realloc(objectOffsets_, newBytes);
658 if (newOffsets == nullptr) {
659 return false;
660 }
661
662 objectOffsets_ = reinterpret_cast<binder_size_t *>(newOffsets);
663 objectsCapacity_ = newCapacity;
664 return true;
665 }
666
ReadBuffer(size_t length, bool isValidate)667 const uint8_t *Parcel::ReadBuffer(size_t length, bool isValidate)
668 {
669 if (GetReadableBytes() >= length) {
670 uint8_t *buffer = data_ + readCursor_;
671 #ifdef PARCEL_OBJECT_CHECK
672 size_t upperBound = readCursor_ + length;
673 if (isValidate && !ValidateReadData(upperBound)) {
674 return nullptr;
675 }
676 #endif
677 readCursor_ += length;
678 return buffer;
679 }
680
681 return nullptr;
682 }
683
WriteObjectOffset(binder_size_t offset)684 bool Parcel::WriteObjectOffset(binder_size_t offset)
685 {
686 if (offset > dataSize_) {
687 return false;
688 }
689
690 for (size_t index = 0; index < objectCursor_; index++) {
691 if (objectOffsets_[index] == offset) {
692 return false;
693 }
694 }
695
696 objectOffsets_[objectCursor_] = offset;
697 objectCursor_++;
698 return true;
699 }
700
WriteRemoteObject(const Parcelable *object)701 bool Parcel::WriteRemoteObject(const Parcelable *object)
702 {
703 size_t placeholder = writeCursor_;
704 // Parcelable is nullptr
705 if ((object == nullptr) || (!object->asRemote_)) {
706 return false;
707 }
708
709 if (!EnsureObjectsCapacity()) {
710 return false;
711 }
712
713 if (!object->Marshalling(*this)) {
714 return false;
715 }
716
717 WriteObjectOffset(placeholder);
718
719 if (object->TestBehavior(Parcelable::BehaviorFlag::HOLD_OBJECT)) {
720 sptr<Parcelable> tmp(const_cast<Parcelable *>(object));
721 objectHolder_.push_back(tmp);
722 }
723
724 return true;
725 }
726
WriteParcelable(const Parcelable *object)727 bool Parcel::WriteParcelable(const Parcelable *object)
728 {
729 size_t placeholder = writeCursor_;
730 size_t restorSize = dataSize_;
731
732 // Parcelable is nullptr
733 if (object == nullptr) {
734 // write the meta data to indicate pass an null object.
735 return WriteInt32(0);
736 }
737
738 if (!object->asRemote_) {
739 // meta data indicate we have an parcelable object.
740 if (!WriteInt32(1)) {
741 return false;
742 }
743
744 return object->Marshalling(*this);
745 }
746
747 // Write the remote object flag
748 if (!WriteInt32(1)) {
749 return false;
750 }
751
752 if (WriteRemoteObject(const_cast<Parcelable*>(object))) {
753 return true;
754 }
755
756 // rollback the write position.
757 writeCursor_ = placeholder;
758 dataSize_ = restorSize;
759 return false;
760 }
761
WriteStrongParcelable(const sptr<Parcelable> &object)762 bool Parcel::WriteStrongParcelable(const sptr<Parcelable> &object)
763 {
764 if (object == nullptr) {
765 WriteInt32(0);
766 return true;
767 }
768
769 object->SetBehavior(Parcelable::BehaviorFlag::HOLD_OBJECT);
770 return WriteParcelable(object.GetRefPtr());
771 }
772
773 template <typename T>
Read(T &value)774 bool Parcel::Read(T &value)
775 {
776 size_t desireCapacity = sizeof(T);
777
778 if (desireCapacity <= GetReadableBytes()) {
779 const void *data = data_ + readCursor_;
780 #ifdef PARCEL_OBJECT_CHECK
781 size_t upperBound = readCursor_ + desireCapacity;
782 if (!ValidateReadData(upperBound)) {
783 readCursor_ += desireCapacity;
784 return false;
785 }
786 #endif
787 readCursor_ += desireCapacity;
788 value = *reinterpret_cast<const T *>(data);
789 return true;
790 }
791
792 return false;
793 }
794
795 template <typename T>
Read()796 T Parcel::Read()
797 {
798 T lvalue {};
799 return Read<T>(lvalue) ? lvalue : 0;
800 }
801
ParseFrom(uintptr_t data, size_t size)802 bool Parcel::ParseFrom(uintptr_t data, size_t size)
803 {
804 if (data_ != nullptr) {
805 return false;
806 }
807
808 data_ = reinterpret_cast<uint8_t *>(data);
809 dataCapacity_ = size;
810 dataSize_ = size;
811 /* data is alloc by driver, can not write again */
812 writable_ = false;
813 #ifdef PARCEL_OBJECT_CHECK
814 if (objectOffsets_) {
815 ClearObjects();
816 }
817 #endif
818 return true;
819 }
820
ReadBuffer(size_t length)821 const uint8_t *Parcel::ReadBuffer(size_t length)
822 {
823 if (GetReadableBytes() >= length) {
824 uint8_t *buffer = data_ + readCursor_;
825 #ifdef PARCEL_OBJECT_CHECK
826 size_t upperBound = readCursor_ + length;
827 if (!ValidateReadData(upperBound)) {
828 return nullptr;
829 }
830 #endif
831 readCursor_ += length;
832 return buffer;
833 }
834
835 return nullptr;
836 }
837
BasicReadBuffer([[maybe_unused]]size_t length)838 const uint8_t *Parcel::BasicReadBuffer([[maybe_unused]]size_t length)
839 {
840 #ifdef PARCEL_OBJECT_CHECK
841 if (GetReadableBytes() >= length) {
842 uint8_t *buffer = data_ + readCursor_;
843 size_t upperBound = readCursor_ + length;
844 if (!ValidateReadData(upperBound)) {
845 readCursor_ += length;
846 return nullptr;
847 }
848 readCursor_ += length;
849 return buffer;
850 }
851 #endif
852 return nullptr;
853 }
854
ReadUnpadBuffer(size_t length)855 const uint8_t *Parcel::ReadUnpadBuffer(size_t length)
856 {
857 if (GetReadableBytes() >= length) {
858 uint8_t *buffer = data_ + readCursor_;
859 #ifdef PARCEL_OBJECT_CHECK
860 size_t upperBound = readCursor_ + length;
861 if (!ValidateReadData(upperBound)) {
862 return nullptr;
863 }
864 #endif
865 readCursor_ += length;
866 SkipBytes(GetPadSize(length));
867 return buffer;
868 }
869
870 return nullptr;
871 }
872
SkipBytes(size_t bytes)873 void Parcel::SkipBytes(size_t bytes)
874 {
875 if (GetReadableBytes() >= bytes) {
876 readCursor_ += bytes;
877 } else if (readCursor_ < dataCapacity_) {
878 readCursor_ = dataCapacity_;
879 }
880 }
881
GetReadPosition()882 size_t Parcel::GetReadPosition()
883 {
884 return readCursor_;
885 }
886
RewindRead(size_t newPosition)887 bool Parcel::RewindRead(size_t newPosition)
888 {
889 if (newPosition > dataSize_) {
890 return false;
891 }
892 readCursor_ = newPosition;
893 nextObjectIdx_ = 0;
894 return true;
895 }
896
GetWritePosition()897 size_t Parcel::GetWritePosition()
898 {
899 return writeCursor_;
900 }
901
RewindWrite(size_t newPosition)902 bool Parcel::RewindWrite(size_t newPosition)
903 {
904 if (newPosition > dataSize_) {
905 return false;
906 }
907 writeCursor_ = newPosition;
908 dataSize_ = newPosition;
909 #ifdef PARCEL_OBJECT_CHECK
910 if (objectOffsets_ == nullptr || objectCursor_ == 0) {
911 return true;
912 }
913 size_t objectSize = objectCursor_;
914 if (objectOffsets_[objectSize - 1] + sizeof(parcel_flat_binder_object) > newPosition) {
915 while (objectSize > 0) {
916 if (objectOffsets_[objectSize - 1] + sizeof(parcel_flat_binder_object) <= newPosition) {
917 break;
918 }
919 objectSize--;
920 }
921 if (objectSize == 0) {
922 ClearObjects();
923 return true;
924 }
925 size_t newBytes = objectSize * sizeof(binder_size_t);
926 void *newOffsets = realloc(objectOffsets_, newBytes);
927 if (newOffsets == nullptr) {
928 return false;
929 }
930 objectOffsets_ = reinterpret_cast<binder_size_t *>(newOffsets);
931 objectCursor_ = objectSize;
932 objectsCapacity_ = objectCursor_;
933 objectHolder_.resize(objectSize);
934 nextObjectIdx_ = 0;
935 return true;
936 }
937 #endif
938 return true;
939 }
940
ReadBool()941 bool Parcel::ReadBool()
942 {
943 int32_t temp = Read<int32_t>();
944 return (temp != 0);
945 }
946
ReadBoolUnaligned()947 bool Parcel::ReadBoolUnaligned()
948 {
949 return Read<bool>();
950 }
951
ReadInt8()952 int8_t Parcel::ReadInt8()
953 {
954 int32_t temp = Read<int32_t>();
955 return static_cast<int8_t>(temp);
956 }
957
ReadInt16()958 int16_t Parcel::ReadInt16()
959 {
960 int32_t temp = Read<int32_t>();
961 return static_cast<int16_t>(temp);
962 }
963
ReadInt32()964 int32_t Parcel::ReadInt32()
965 {
966 return Read<int32_t>();
967 }
968
ReadInt64()969 int64_t Parcel::ReadInt64()
970 {
971 return Read<int64_t>();
972 }
973
ReadUint8()974 uint8_t Parcel::ReadUint8()
975 {
976 uint32_t temp = Read<uint32_t>();
977 return static_cast<uint8_t>(temp);
978 }
979
ReadUint16()980 uint16_t Parcel::ReadUint16()
981 {
982 uint32_t temp = Read<uint32_t>();
983 return static_cast<uint16_t>(temp);
984 }
985
ReadUint32()986 uint32_t Parcel::ReadUint32()
987 {
988 return Read<uint32_t>();
989 }
990
ReadUint64()991 uint64_t Parcel::ReadUint64()
992 {
993 return Read<uint64_t>();
994 }
995
ReadFloat()996 float Parcel::ReadFloat()
997 {
998 return Read<float>();
999 }
1000
ReadDouble()1001 double Parcel::ReadDouble()
1002 {
1003 return Read<double>();
1004 }
1005
1006 template <typename T>
ReadPadded(T &value)1007 bool Parcel::ReadPadded(T &value)
1008 {
1009 int32_t temp;
1010 bool result = Read<int32_t>(temp);
1011 if (result) {
1012 value = static_cast<T>(temp);
1013 }
1014
1015 return result;
1016 }
1017
ReadBool(bool &value)1018 bool Parcel::ReadBool(bool &value)
1019 {
1020 return ReadPadded<bool>(value);
1021 }
1022
ReadInt8(int8_t &value)1023 bool Parcel::ReadInt8(int8_t &value)
1024 {
1025 return ReadPadded<int8_t>(value);
1026 }
1027
ReadInt8Unaligned(int8_t &value)1028 bool Parcel::ReadInt8Unaligned(int8_t &value)
1029 {
1030 return Read<int8_t>(value);
1031 }
1032
ReadInt16(int16_t &value)1033 bool Parcel::ReadInt16(int16_t &value)
1034 {
1035 return ReadPadded<int16_t>(value);
1036 }
1037
ReadInt16Unaligned(int16_t &value)1038 bool Parcel::ReadInt16Unaligned(int16_t &value)
1039 {
1040 return Read<int16_t>(value);
1041 }
1042
ReadInt32(int32_t &value)1043 bool Parcel::ReadInt32(int32_t &value)
1044 {
1045 return Read<int32_t>(value);
1046 }
1047
ReadInt64(int64_t &value)1048 bool Parcel::ReadInt64(int64_t &value)
1049 {
1050 return Read<int64_t>(value);
1051 }
1052
ReadUint8(uint8_t &value)1053 bool Parcel::ReadUint8(uint8_t &value)
1054 {
1055 return ReadPadded<uint8_t>(value);
1056 }
1057
ReadUint8Unaligned(uint8_t &value)1058 bool Parcel::ReadUint8Unaligned(uint8_t &value)
1059 {
1060 return Read<uint8_t>(value);
1061 }
1062
ReadUint16(uint16_t &value)1063 bool Parcel::ReadUint16(uint16_t &value)
1064 {
1065 return ReadPadded<uint16_t>(value);
1066 }
1067
ReadUint16Unaligned(uint16_t &value)1068 bool Parcel::ReadUint16Unaligned(uint16_t &value)
1069 {
1070 return Read<uint16_t>(value);
1071 }
1072
ReadUint32(uint32_t &value)1073 bool Parcel::ReadUint32(uint32_t &value)
1074 {
1075 return Read<uint32_t>(value);
1076 }
1077
ReadUint64(uint64_t &value)1078 bool Parcel::ReadUint64(uint64_t &value)
1079 {
1080 return Read<uint64_t>(value);
1081 }
1082
ReadFloat(float &value)1083 bool Parcel::ReadFloat(float &value)
1084 {
1085 return Read<float>(value);
1086 }
1087
ReadDouble(double &value)1088 bool Parcel::ReadDouble(double &value)
1089 {
1090 return Read<double>(value);
1091 }
1092
ReadPointer()1093 uintptr_t Parcel::ReadPointer()
1094 {
1095 return Read<binder_uintptr_t>();
1096 }
1097
ReadCString()1098 const char *Parcel::ReadCString()
1099 {
1100 size_t oldCursor = readCursor_;
1101 const size_t avail = GetReadableBytes();
1102 const char* cstr = reinterpret_cast<const char*>(data_ + readCursor_);
1103 // is the string's trailing NUL within the parcel's valid bounds?
1104 const char* eos = reinterpret_cast<const char*>(memchr(cstr, 0, avail));
1105 if (eos != nullptr) {
1106 const size_t dataLength = eos - cstr;
1107 readCursor_ += (dataLength + 1);
1108 SkipBytes(GetPadSize(dataLength + 1));
1109 return cstr;
1110 }
1111 readCursor_ = oldCursor;
1112 return nullptr;
1113 }
1114
ReadString()1115 const std::string Parcel::ReadString()
1116 {
1117 int32_t dataLength = 0;
1118 size_t oldCursor = readCursor_;
1119
1120 if (!Read<int32_t>(dataLength) || dataLength < 0 || dataLength >= INT32_MAX) {
1121 return std::string();
1122 }
1123
1124 size_t readCapacity = static_cast<size_t>(dataLength) + 1;
1125 if (readCapacity <= GetReadableBytes()) {
1126 #ifdef PARCEL_OBJECT_CHECK
1127 const uint8_t *dest = BasicReadBuffer(readCapacity);
1128 #else
1129 const uint8_t *dest = ReadBuffer(readCapacity);
1130 #endif
1131 if (dest != nullptr) {
1132 const auto *str = reinterpret_cast<const char *>(dest);
1133 SkipBytes(GetPadSize(readCapacity));
1134 if (str[dataLength] == 0) {
1135 return std::string(str, dataLength);
1136 }
1137 }
1138 }
1139
1140 readCursor_ = oldCursor;
1141 return std::string();
1142 }
1143
ReadString(std::string &value)1144 bool Parcel::ReadString(std::string &value)
1145 {
1146 int32_t dataLength = 0;
1147 size_t oldCursor = readCursor_;
1148
1149 if (!Read<int32_t>(dataLength) || dataLength < 0 || dataLength >= INT32_MAX) {
1150 value = std::string();
1151 return false;
1152 }
1153
1154 size_t readCapacity = static_cast<size_t>(dataLength) + 1;
1155 if (readCapacity <= GetReadableBytes()) {
1156 #ifdef PARCEL_OBJECT_CHECK
1157 const uint8_t *dest = BasicReadBuffer(readCapacity);
1158 #else
1159 const uint8_t *dest = ReadBuffer(readCapacity);
1160 #endif
1161 if (dest != nullptr) {
1162 const auto *str = reinterpret_cast<const char *>(dest);
1163 SkipBytes(GetPadSize(readCapacity));
1164 if (str[dataLength] == 0) {
1165 value = std::string(str, dataLength);
1166 return true;
1167 }
1168 }
1169 }
1170
1171 readCursor_ = oldCursor;
1172 value = std::string();
1173 return false;
1174 }
1175
ReadString16()1176 const std::u16string Parcel::ReadString16()
1177 {
1178 int32_t dataLength = 0;
1179 size_t oldCursor = readCursor_;
1180
1181 if (!Read<int32_t>(dataLength) || dataLength < 0 || dataLength >= INT32_MAX) {
1182 return std::u16string();
1183 }
1184
1185 size_t readCapacity = (static_cast<size_t>(dataLength) + 1) * sizeof(char16_t);
1186 if ((readCapacity > (static_cast<size_t>(dataLength))) && (readCapacity <= GetReadableBytes())) {
1187 #ifdef PARCEL_OBJECT_CHECK
1188 const uint8_t *str = BasicReadBuffer(readCapacity);
1189 #else
1190 const uint8_t *str = ReadBuffer(readCapacity);
1191 #endif
1192 if (str != nullptr) {
1193 const auto *u16Str = reinterpret_cast<const char16_t *>(str);
1194 SkipBytes(GetPadSize(readCapacity));
1195 if (u16Str[dataLength] == 0) {
1196 return std::u16string(u16Str, dataLength);
1197 }
1198 }
1199 }
1200
1201 readCursor_ = oldCursor;
1202 return std::u16string();
1203 }
1204
ReadString16(std::u16string &value)1205 bool Parcel::ReadString16(std::u16string &value)
1206 {
1207 int32_t dataLength = 0;
1208 size_t oldCursor = readCursor_;
1209
1210 if (!Read<int32_t>(dataLength) || dataLength < 0 || dataLength >= INT32_MAX) {
1211 value = std::u16string();
1212 return false;
1213 }
1214
1215 size_t readCapacity = (static_cast<size_t>(dataLength) + 1) * sizeof(char16_t);
1216 if ((readCapacity > (static_cast<size_t>(dataLength))) && (readCapacity <= GetReadableBytes())) {
1217 #ifdef PARCEL_OBJECT_CHECK
1218 const uint8_t *str = BasicReadBuffer(readCapacity);
1219 #else
1220 const uint8_t *str = ReadBuffer(readCapacity);
1221 #endif
1222 if (str != nullptr) {
1223 const auto *u16Str = reinterpret_cast<const char16_t *>(str);
1224 SkipBytes(GetPadSize(readCapacity));
1225 if (u16Str[dataLength] == 0) {
1226 value = std::u16string(u16Str, dataLength);
1227 return true;
1228 }
1229 }
1230 }
1231
1232 readCursor_ = oldCursor;
1233 value = std::u16string();
1234 return false;
1235 }
1236
ReadString16WithLength(int32_t &readLength)1237 const std::u16string Parcel::ReadString16WithLength(int32_t &readLength)
1238 {
1239 int32_t dataLength = 0;
1240 size_t oldCursor = readCursor_;
1241
1242 if (!Read<int32_t>(dataLength)) {
1243 return std::u16string();
1244 }
1245
1246 if (dataLength < 0 || dataLength >= INT32_MAX) {
1247 readLength = dataLength;
1248 return std::u16string();
1249 }
1250
1251 size_t readCapacity = (static_cast<size_t>(dataLength) + 1) * sizeof(char16_t);
1252 if ((readCapacity > (static_cast<size_t>(dataLength))) && (readCapacity <= GetReadableBytes())) {
1253 #ifdef PARCEL_OBJECT_CHECK
1254 const uint8_t *str = BasicReadBuffer(readCapacity);
1255 #else
1256 const uint8_t *str = ReadBuffer(readCapacity);
1257 #endif
1258 if (str != nullptr) {
1259 const auto *u16Str = reinterpret_cast<const char16_t *>(str);
1260 SkipBytes(GetPadSize(readCapacity));
1261 if (u16Str[dataLength] == 0) {
1262 readLength = dataLength;
1263 return std::u16string(u16Str, dataLength);
1264 }
1265 }
1266 }
1267
1268 readCursor_ = oldCursor;
1269 return std::u16string();
1270 }
1271
ReadString8WithLength(int32_t &readLength)1272 const std::string Parcel::ReadString8WithLength(int32_t &readLength)
1273 {
1274 int32_t dataLength = 0;
1275 size_t oldCursor = readCursor_;
1276
1277 if (!Read<int32_t>(dataLength)) {
1278 return std::string();
1279 }
1280
1281 if (dataLength < 0 || dataLength >= INT32_MAX) {
1282 readLength = dataLength;
1283 return std::string();
1284 }
1285
1286 size_t readCapacity = (static_cast<size_t>(dataLength) + 1) * sizeof(char);
1287 if (readCapacity <= GetReadableBytes()) {
1288 #ifdef PARCEL_OBJECT_CHECK
1289 const uint8_t *str = BasicReadBuffer(readCapacity);
1290 #else
1291 const uint8_t *str = ReadBuffer(readCapacity);
1292 #endif
1293 if (str != nullptr) {
1294 const auto *u8Str = reinterpret_cast<const char *>(str);
1295 SkipBytes(GetPadSize(readCapacity));
1296 if (u8Str[dataLength] == 0) {
1297 readLength = dataLength;
1298 return std::string(u8Str, dataLength);
1299 }
1300 }
1301 }
1302
1303 readCursor_ = oldCursor;
1304 return std::string();
1305 }
1306
Alloc(size_t size)1307 void *DefaultAllocator::Alloc(size_t size)
1308 {
1309 return malloc(size);
1310 }
1311
Dealloc(void *data)1312 void DefaultAllocator::Dealloc(void *data)
1313 {
1314 if (data != nullptr) {
1315 free(data);
1316 }
1317 }
1318
Realloc(void *data, size_t newSize)1319 void *DefaultAllocator::Realloc(void *data, size_t newSize)
1320 {
1321 return realloc(data, newSize);
1322 }
1323
1324 template <typename T1, typename T2>
WriteVector(const std::vector<T1> &val, bool (Parcel::*Write)(T2))1325 bool Parcel::WriteVector(const std::vector<T1> &val, bool (Parcel::*Write)(T2))
1326 {
1327 if (val.size() > INT_MAX) {
1328 return false;
1329 }
1330
1331 if (!this->WriteInt32(static_cast<int32_t>(val.size()))) {
1332 return false;
1333 }
1334
1335 for (const auto &v : val) {
1336 if (!(this->*Write)(v)) {
1337 return false;
1338 }
1339 }
1340
1341 size_t padSize = this->GetPadSize(val.size() * sizeof(T1));
1342 if (!EnsureWritableCapacity(padSize)) {
1343 return false;
1344 }
1345 this->WritePadBytes(padSize);
1346 return true;
1347 }
1348
1349 template <typename Type, typename T1, typename T2>
WriteFixedAlignVector(const std::vector<T1> &originVal, bool (Parcel::*SpecialWrite)(T2))1350 bool Parcel::WriteFixedAlignVector(const std::vector<T1> &originVal, bool (Parcel::*SpecialWrite)(T2))
1351 {
1352 if (originVal.size() > INT_MAX) {
1353 return false;
1354 }
1355
1356 if (!this->WriteInt32(static_cast<int32_t>(originVal.size()))) {
1357 return false;
1358 }
1359 // Use the specified interface to write a single element.
1360 for (const auto &v : originVal) {
1361 if (!(this->*SpecialWrite)(v)) {
1362 return false;
1363 }
1364 }
1365 // The write length of these interfaces is different from the original type.
1366 // They need to use the specified write length and calculate the padSize based on this.
1367 size_t padSize = this->GetPadSize(originVal.size() * sizeof(Type));
1368 if (!EnsureWritableCapacity(padSize)) {
1369 return false;
1370 }
1371 this->WritePadBytes(padSize);
1372 return true;
1373 }
1374
WriteBoolVector(const std::vector<bool> &val)1375 bool Parcel::WriteBoolVector(const std::vector<bool> &val)
1376 {
1377 return WriteFixedAlignVector<int32_t>(val, &Parcel::WriteBool);
1378 }
1379
WriteInt8Vector(const std::vector<int8_t> &val)1380 bool Parcel::WriteInt8Vector(const std::vector<int8_t> &val)
1381 {
1382 return WriteVector(val, &Parcel::WriteInt8Unaligned);
1383 }
1384
WriteInt16Vector(const std::vector<int16_t> &val)1385 bool Parcel::WriteInt16Vector(const std::vector<int16_t> &val)
1386 {
1387 return WriteFixedAlignVector<int32_t>(val, &Parcel::WriteInt16);
1388 }
1389
WriteInt32Vector(const std::vector<int32_t> &val)1390 bool Parcel::WriteInt32Vector(const std::vector<int32_t> &val)
1391 {
1392 return WriteVector(val, &Parcel::WriteInt32);
1393 }
1394
WriteInt64Vector(const std::vector<int64_t> &val)1395 bool Parcel::WriteInt64Vector(const std::vector<int64_t> &val)
1396 {
1397 return WriteVector(val, &Parcel::WriteInt64);
1398 }
1399
WriteUInt8Vector(const std::vector<uint8_t> &val)1400 bool Parcel::WriteUInt8Vector(const std::vector<uint8_t> &val)
1401 {
1402 return WriteVector(val, &Parcel::WriteUint8Unaligned);
1403 }
1404
WriteUInt16Vector(const std::vector<uint16_t> &val)1405 bool Parcel::WriteUInt16Vector(const std::vector<uint16_t> &val)
1406 {
1407 return WriteVector(val, &Parcel::WriteUint16Unaligned);
1408 }
1409
WriteUInt32Vector(const std::vector<uint32_t> &val)1410 bool Parcel::WriteUInt32Vector(const std::vector<uint32_t> &val)
1411 {
1412 return WriteVector(val, &Parcel::WriteUint32);
1413 }
1414
WriteUInt64Vector(const std::vector<uint64_t> &val)1415 bool Parcel::WriteUInt64Vector(const std::vector<uint64_t> &val)
1416 {
1417 return WriteVector(val, &Parcel::WriteUint64);
1418 }
1419
WriteFloatVector(const std::vector<float> &val)1420 bool Parcel::WriteFloatVector(const std::vector<float> &val)
1421 {
1422 return WriteVector(val, &Parcel::WriteFloat);
1423 }
1424
WriteDoubleVector(const std::vector<double> &val)1425 bool Parcel::WriteDoubleVector(const std::vector<double> &val)
1426 {
1427 return WriteVector(val, &Parcel::WriteDouble);
1428 }
1429
WriteStringVector(const std::vector<std::string> &val)1430 bool Parcel::WriteStringVector(const std::vector<std::string> &val)
1431 {
1432 return WriteVector(val, &Parcel::WriteString);
1433 }
1434
WriteString16Vector(const std::vector<std::u16string> &val)1435 bool Parcel::WriteString16Vector(const std::vector<std::u16string> &val)
1436 {
1437 return WriteVector(val, &Parcel::WriteString16);
1438 }
1439
1440 template <typename T>
ReadVector(std::vector<T> *val, bool (Parcel::*Read)(T &))1441 bool Parcel::ReadVector(std::vector<T> *val, bool (Parcel::*Read)(T &))
1442 {
1443 if (val == nullptr) {
1444 return false;
1445 }
1446
1447 int32_t len = this->ReadInt32();
1448 if (len < 0) {
1449 return false;
1450 }
1451
1452 size_t readAbleSize = this->GetReadableBytes() / sizeof(T);
1453 size_t size = static_cast<size_t>(len);
1454 if ((size > readAbleSize) || (size > val->max_size())) {
1455 UTILS_LOGE("Failed to read vector, size = %{public}zu, readAbleSize = %{public}zu", size, readAbleSize);
1456 return false;
1457 }
1458 val->resize(size);
1459 if (val->size() < size) {
1460 return false;
1461 }
1462
1463 for (auto &v : *val) {
1464 if (!(this->*Read)(v)) {
1465 return false;
1466 }
1467 }
1468
1469 size_t padSize = this->GetPadSize(size * sizeof(T));
1470 this->SkipBytes(padSize);
1471 return true;
1472 }
1473
1474 template <typename Type, typename T1, typename T2>
ReadFixedAlignVector(std::vector<T1> *val, bool (Parcel::*SpecialRead)(T2 &))1475 bool Parcel::ReadFixedAlignVector(std::vector<T1> *val, bool (Parcel::*SpecialRead)(T2 &))
1476 {
1477 if (val == nullptr) {
1478 return false;
1479 }
1480
1481 int32_t len = this->ReadInt32();
1482 if (len < 0) {
1483 return false;
1484 }
1485
1486 size_t readAbleSize = this->GetReadableBytes() / sizeof(Type);
1487 size_t size = static_cast<size_t>(len);
1488 if ((size > readAbleSize) || (size > val->max_size())) {
1489 UTILS_LOGE("Failed to fixed aligned read vector, size = %{public}zu, readAbleSize = %{public}zu",
1490 size, readAbleSize);
1491 return false;
1492 }
1493 val->resize(size);
1494 if (val->size() < size) {
1495 return false;
1496 }
1497
1498 for (size_t i = 0; i < size; ++i) {
1499 T2 parcelVal;
1500 if (!(this->*SpecialRead)(parcelVal)) {
1501 return false;
1502 }
1503 (*val)[i] = parcelVal;
1504 }
1505
1506 size_t padSize = this->GetPadSize(size * sizeof(Type));
1507 this->SkipBytes(padSize);
1508 return true;
1509 }
1510
ReadBoolVector(std::vector<bool> *val)1511 bool Parcel::ReadBoolVector(std::vector<bool> *val)
1512 {
1513 return ReadFixedAlignVector<int32_t>(val, &Parcel::ReadBool);
1514 }
1515
ReadInt8Vector(std::vector<int8_t> *val)1516 bool Parcel::ReadInt8Vector(std::vector<int8_t> *val)
1517 {
1518 return ReadVector(val, &Parcel::ReadInt8Unaligned);
1519 }
1520
ReadInt16Vector(std::vector<int16_t> *val)1521 bool Parcel::ReadInt16Vector(std::vector<int16_t> *val)
1522 {
1523 return ReadFixedAlignVector<int32_t>(val, &Parcel::ReadInt16);
1524 }
1525
ReadInt32Vector(std::vector<int32_t> *val)1526 bool Parcel::ReadInt32Vector(std::vector<int32_t> *val)
1527 {
1528 return ReadVector(val, &Parcel::ReadInt32);
1529 }
1530
ReadInt64Vector(std::vector<int64_t> *val)1531 bool Parcel::ReadInt64Vector(std::vector<int64_t> *val)
1532 {
1533 return ReadVector(val, &Parcel::ReadInt64);
1534 }
1535
ReadUInt8Vector(std::vector<uint8_t> *val)1536 bool Parcel::ReadUInt8Vector(std::vector<uint8_t> *val)
1537 {
1538 return ReadVector(val, &Parcel::ReadUint8Unaligned);
1539 }
1540
ReadUInt16Vector(std::vector<uint16_t> *val)1541 bool Parcel::ReadUInt16Vector(std::vector<uint16_t> *val)
1542 {
1543 return ReadVector(val, &Parcel::ReadUint16Unaligned);
1544 }
1545
ReadUInt32Vector(std::vector<uint32_t> *val)1546 bool Parcel::ReadUInt32Vector(std::vector<uint32_t> *val)
1547 {
1548 return ReadVector(val, &Parcel::ReadUint32);
1549 }
1550
ReadUInt64Vector(std::vector<uint64_t> *val)1551 bool Parcel::ReadUInt64Vector(std::vector<uint64_t> *val)
1552 {
1553 return ReadVector(val, &Parcel::ReadUint64);
1554 }
1555
ReadFloatVector(std::vector<float> *val)1556 bool Parcel::ReadFloatVector(std::vector<float> *val)
1557 {
1558 return ReadVector(val, &Parcel::ReadFloat);
1559 }
1560
ReadDoubleVector(std::vector<double> *val)1561 bool Parcel::ReadDoubleVector(std::vector<double> *val)
1562 {
1563 return ReadVector(val, &Parcel::ReadDouble);
1564 }
1565
ReadStringVector(std::vector<std::string> *val)1566 bool Parcel::ReadStringVector(std::vector<std::string> *val)
1567 {
1568 if (val == nullptr) {
1569 return false;
1570 }
1571
1572 int32_t len = this->ReadInt32();
1573 if (len < 0) {
1574 return false;
1575 }
1576
1577 size_t readAbleSize = this->GetReadableBytes();
1578 size_t size = static_cast<size_t>(len);
1579 if ((size > readAbleSize) || (val->max_size() < size)) {
1580 UTILS_LOGE("Failed to read string vector, size = %{public}zu, readAbleSize = %{public}zu", size, readAbleSize);
1581 return false;
1582 }
1583 val->resize(size);
1584 if (val->size() < size) {
1585 return false;
1586 }
1587
1588 for (auto &v : *val) {
1589 v = ReadString();
1590 }
1591
1592 return true;
1593 }
1594
ReadString16Vector(std::vector<std::u16string> *val)1595 bool Parcel::ReadString16Vector(std::vector<std::u16string> *val)
1596 {
1597 if (val == nullptr) {
1598 return false;
1599 }
1600
1601 int32_t len = this->ReadInt32();
1602 if (len < 0) {
1603 return false;
1604 }
1605
1606 size_t readAbleSize = this->GetReadableBytes();
1607 size_t size = static_cast<size_t>(len);
1608 if ((size > readAbleSize) || (val->max_size() < size)) {
1609 UTILS_LOGE("Failed to read u16string vector, size = %{public}zu, readAbleSize = %{public}zu",
1610 size, readAbleSize);
1611 return false;
1612 }
1613
1614 val->resize(size);
1615 if (val->size() < size) {
1616 return false;
1617 }
1618
1619 for (auto &v : *val) {
1620 v = ReadString16();
1621 }
1622
1623 return true;
1624 }
1625 } // namespace OHOS
1626