Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c93eebeb authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "libbinder: Allow vector construction from unaligned data." am:...

Merge "libbinder: Allow vector construction from unaligned data." am: f2532967 am: 4840d1e7 am: 33435dd1

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2087849



Change-Id: I3334efe86b51973a486f4bd42030351a5012a400
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 1f9c0430 33435dd1
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -1184,10 +1184,20 @@ private:
        c->clear(); // must clear before resizing/reserving otherwise move ctors may be called.
        if constexpr (is_pointer_equivalent_array_v<T>) {
            // could consider POD without gaps and alignment of 4.
            auto data = reinterpret_cast<const T*>(
                    readInplace(static_cast<size_t>(size) * sizeof(T)));
            size_t dataLen;
            if (__builtin_mul_overflow(size, sizeof(T), &dataLen)) {
                return -EOVERFLOW;
            }
            auto data = reinterpret_cast<const T*>(readInplace(dataLen));
            if (data == nullptr) return BAD_VALUE;
            c->insert(c->begin(), data, data + size); // insert should do a reserve().
            // std::vector::insert and similar methods will require type-dependent
            // byte alignment when inserting from a const iterator such as `data`,
            // e.g. 8 byte alignment for int64_t, and so will not work if `data`
            // is 4 byte aligned (which is all Parcel guarantees). Copying
            // the contents into the vector directly, where possible, circumvents
            // this.
            c->resize(size);
            memcpy(c->data(), data, dataLen);
        } else if constexpr (std::is_same_v<T, bool>
                || std::is_same_v<T, char16_t>) {
            c->reserve(size); // avoids default initialization