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

Commit 04655aab authored by Akilesh Kailash's avatar Akilesh Kailash Committed by Automerger Merge Worker
Browse files

Merge "snapuserd: Address alignment fault on 32-bit systems" am: cddf0f75...

Merge "snapuserd: Address alignment fault on 32-bit systems" am: cddf0f75 am: 28292209 am: a5675626

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1907026

Change-Id: Ia1fab1c9385004634929e1f481c5f4e700cc1e1a
parents 3cf47897 a5675626
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -246,9 +246,15 @@ bool ReadAheadThread::ReconstructDataFromCow() {
    int num_ops = 0;
    int num_ops = 0;
    int total_blocks_merged = 0;
    int total_blocks_merged = 0;


    // This memcpy is important as metadata_buffer_ will be an unaligned address and will fault
    // on 32-bit systems
    std::unique_ptr<uint8_t[]> metadata_buffer =
            std::make_unique<uint8_t[]>(snapuserd_->GetBufferMetadataSize());
    memcpy(metadata_buffer.get(), metadata_buffer_, snapuserd_->GetBufferMetadataSize());

    while (true) {
    while (true) {
        struct ScratchMetadata* bm = reinterpret_cast<struct ScratchMetadata*>(
        struct ScratchMetadata* bm = reinterpret_cast<struct ScratchMetadata*>(
                (char*)metadata_buffer_ + metadata_offset);
                (char*)metadata_buffer.get() + metadata_offset);


        // Done reading metadata
        // Done reading metadata
        if (bm->new_block == 0 && bm->file_offset == 0) {
        if (bm->new_block == 0 && bm->file_offset == 0) {
+7 −1
Original line number Original line Diff line number Diff line
@@ -121,9 +121,15 @@ bool ReadAhead::ReconstructDataFromCow() {
    int num_ops = 0;
    int num_ops = 0;
    int total_blocks_merged = 0;
    int total_blocks_merged = 0;


    // This memcpy is important as metadata_buffer_ will be an unaligned address and will fault
    // on 32-bit systems
    std::unique_ptr<uint8_t[]> metadata_buffer =
            std::make_unique<uint8_t[]>(snapuserd_->GetBufferMetadataSize());
    memcpy(metadata_buffer.get(), metadata_buffer_, snapuserd_->GetBufferMetadataSize());

    while (true) {
    while (true) {
        struct ScratchMetadata* bm = reinterpret_cast<struct ScratchMetadata*>(
        struct ScratchMetadata* bm = reinterpret_cast<struct ScratchMetadata*>(
                (char*)metadata_buffer_ + metadata_offset);
                (char*)metadata_buffer.get() + metadata_offset);


        // Done reading metadata
        // Done reading metadata
        if (bm->new_block == 0 && bm->file_offset == 0) {
        if (bm->new_block == 0 && bm->file_offset == 0) {