From 3aa4dc7f64b5948c29121240a2b7b5eda2806231 Mon Sep 17 00:00:00 2001 From: Will Shiu Date: Wed, 29 Jul 2020 17:03:17 +0800 Subject: [PATCH] EncryptInPlace: ensure that backup superblocks get encrypted Block groups with EXT4_BG_BLOCK_UNINIT still have backup superblocks (and backup block group descriptors). Fix EncryptInPlace to encrypt these backup superblocks rather than leave them unencrypted. Previously leaving the backup superblocks unencrypted didn't cause any problems, but due to system/core commit 72abd7b246f7 ("Try to recover corrupted ext4 /data with backup superblock") it is causing problems. Bug: 162479411 Bug: 161871210 Merged-In: Ic090bf4e88193b289b04c5254ddf661ef40b037e Change-Id: Ic090bf4e88193b289b04c5254ddf661ef40b037e --- EncryptInplace.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/EncryptInplace.cpp b/EncryptInplace.cpp index 9d304da..b1bd11d 100644 --- a/EncryptInplace.cpp +++ b/EncryptInplace.cpp @@ -205,9 +205,16 @@ static int encrypt_groups(struct encryptGroupsData* data) { data->count = 0; for (block = 0; block < block_count; block++) { - int used = (aux_info.bg_desc[i].bg_flags & EXT4_BG_BLOCK_UNINIT) - ? 0 - : bitmap_get_bit(block_bitmap, block); + int used; + + if (aux_info.bg_desc[i].bg_flags & EXT4_BG_BLOCK_UNINIT) { + // In block groups with an uninitialized block bitmap, we only + // need to encrypt the backup superblock (if one is present). + used = (ext4_bg_has_super_block(i) && block < 1 + aux_info.bg_desc_blocks); + } else { + used = bitmap_get_bit(block_bitmap, block); + } + update_progress(data, used); if (used) { if (data->count == 0) {