From 38b83c1da45f0b4a7d166bee73dc7701794874c3 Mon Sep 17 00:00:00 2001 From: bigbiff bigbiff Date: Thu, 28 Dec 2017 19:58:52 -0500 Subject: ADB Backup: fix md5 check on restore. Add debug capability. Fix backup of images after tarred partitions with too much padding Add more md5 logging. Skip digest check if selected. Change ADB Backup version to 3 for new fixes to image padding. Change-Id: I0f76c0733c523717e4797d1a14c3ae47d046fc8c --- twrpAdbBuFifo.cpp | 77 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 33 deletions(-) (limited to 'twrpAdbBuFifo.cpp') diff --git a/twrpAdbBuFifo.cpp b/twrpAdbBuFifo.cpp index 0c7dd1524..1147d63db 100644 --- a/twrpAdbBuFifo.cpp +++ b/twrpAdbBuFifo.cpp @@ -103,6 +103,8 @@ bool twrpAdbBuFifo::Backup_ADB_Command(std::string Options) { if (args[1].compare("--twrp") != 0) { gui_err("twrp_adbbu_option=--twrp option is required to enable twrp adb backup"); + if (!twadbbu::Write_TWERROR()) + LOGERR("Unable to write to ADB Backup\n"); sleep(2); return false; } @@ -130,9 +132,11 @@ bool twrpAdbBuFifo::Backup_ADB_Command(std::string Options) { } else { gui_msg(Msg(msg::kError, "partition_not_found=path: {1} not found in partition list")(path)); - return false; - } + if (!twadbbu::Write_TWERROR()) + LOGERR("Unable to write to TWRP ADB Backup.\n"); + return false; } +} if (Backup_List.empty()) { DataManager::GetValue("tw_backup_list", Backup_List); @@ -187,7 +191,7 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { DataManager::SetValue("tw_action_text2", ""); gui_changePage("action_page"); - while (1) { + while (true) { memset(&cmd, 0, sizeof(cmd)); if (read(adb_control_twrp_fd, cmd, sizeof(cmd)) > 0) { struct AdbBackupControlType cmdstruct; @@ -202,37 +206,49 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { LOGINFO("ADB version: %" PRIu64 "\n", twhdr.version); if (twhdr.version != ADB_BACKUP_VERSION) { LOGERR("Incompatible adb backup version!\n"); + ret = false; break; } partition_count = twhdr.partition_count; } else if (cmdtype == MD5TRAILER) { - LOGINFO("Restoring MD5TRAILER\n"); + LOGINFO("Reading ADB Backup MD5TRAILER\n"); memcpy(&adbmd5, cmd, sizeof(cmd)); } else if (cmdtype == TWMD5) { - struct AdbBackupFileTrailer md5check; - LOGINFO("Restoring TWMD5\n"); - - memset(&md5check, 0, sizeof(md5check)); - memcpy(&md5check, cmd, sizeof(cmd)); - if (strcmp(md5check.md5, adbmd5.md5) != 0) { - LOGERR("md5 doesn't match!\n"); - LOGERR("file md5: %s\n", adbmd5.md5); - LOGERR("check md5: %s\n", md5check.md5); - ret = false; - break; - } - else { - LOGINFO("adbrestore md5 matches\n"); - LOGINFO("adbmd5.md5: %s\n", adbmd5.md5); - LOGINFO("md5check.md5: %s\n", md5check.md5); - ret = true; - break; + int check_digest; + + DataManager::GetValue(TW_SKIP_DIGEST_CHECK_VAR, check_digest); + if (check_digest > 0) { + TWFunc::GUI_Operation_Text(TW_VERIFY_DIGEST_TEXT, gui_parse_text("{@verifying_digest}")); + gui_msg("verifying_digest=Verifying Digest"); + struct AdbBackupFileTrailer md5check; + LOGINFO("Verifying md5sums\n"); + + memset(&md5check, 0, sizeof(md5check)); + memcpy(&md5check, cmd, sizeof(cmd)); + if (strcmp(md5check.md5, adbmd5.md5) != 0) { + LOGERR("md5 doesn't match!\n"); + LOGERR("Stored file md5: %s\n", adbmd5.md5); + LOGERR("ADB Backup check md5: %s\n", md5check.md5); + ret = false; + break; + } + else { + LOGINFO("ADB Backup md5 matches\n"); + LOGINFO("Stored file md5: %s\n", adbmd5.md5); + LOGINFO("ADB Backup check md5: %s\n", md5check.md5); + continue; + } + } else { + gui_msg("skip_digest=Skipping Digest check based on user setting."); + continue; } + } else if (cmdtype == TWENDADB) { LOGINFO("received TWENDADB\n"); + ret = 1; break; } else { @@ -270,6 +286,7 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { if (!PartitionManager.Restore_Partition(&part_settings)) { LOGERR("ADB Restore failed.\n"); ret = false; + break; } } else if (cmdtype == TWFN) { @@ -296,17 +313,11 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { if (path.compare("/system") == 0) { if (part_settings.Part->Is_Read_Only()) { - struct AdbBackupControlType twerror; - strncpy(twerror.start_of_header, TWRP, sizeof(twerror.start_of_header)); - strncpy(twerror.type, TWERROR, sizeof(twerror.type)); - memset(twerror.space, 0, sizeof(twerror.space)); - twerror.crc = crc32(0L, Z_NULL, 0); - twerror.crc = crc32(twerror.crc, (const unsigned char*) &twerror, sizeof(twerror)); - if (write(adb_control_bu_fd, &twerror, sizeof(twerror)) < 0) { - LOGERR("Cannot write to ADB_CONTROL_BU_FD: %s\n", strerror(errno)); - } + if (!twadbbu::Write_TWERROR()) + LOGERR("Unable to write to TWRP ADB Backup.\n"); gui_msg(Msg(msg::kError, "restore_read_only=Cannot restore {1} -- mounted read only.")(part_settings.Part->Backup_Display_Name)); - return false; + ret = false; + break; } } @@ -320,6 +331,7 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { if (!PartitionManager.Restore_Partition(&part_settings)) { LOGERR("ADB Restore failed.\n"); ret = false; + break; } } } @@ -337,6 +349,5 @@ bool twrpAdbBuFifo::Restore_ADB_Backup(void) { DataManager::SetValue("ui_progress", 100); gui_changePage("main"); close(adb_control_bu_fd); - close(adb_control_twrp_fd); return ret; } -- cgit v1.2.3