diff --git a/interfaces/kits/packages/package.cpp b/interfaces/kits/packages/package.cpp index ea618a6cf347af8db25ee8cd51730984b2ed2c6e..c61dd543379dc69a24ed9108d45cc0e398390e24 100755 --- a/interfaces/kits/packages/package.cpp +++ b/interfaces/kits/packages/package.cpp @@ -301,8 +301,13 @@ int32_t ExtraPackageFile(const char *packagePath, [[maybe_unused]] const char *k PkgManager::ReleasePackageInstance(manager); return PKG_INVALID_STREAM; } - manager->ExtractFile(file, outStream); - + ret = manager->ExtractFile(file, outStream); + if (ret != PKG_SUCCESS) { + LOG(ERROR) << "extract file failed" << file; + manager->ClosePkgStream(outStream); + PkgManager::ReleasePackageInstance(manager); + return PKG_INVALID_FILE; + } manager->ClosePkgStream(outStream); PkgManager::ReleasePackageInstance(manager); return PKG_SUCCESS; diff --git a/services/applypatch/transfer_manager.cpp b/services/applypatch/transfer_manager.cpp index 3810cca30f6bbcc5ddc416b662ff65af9a82055b..3b4ed3cce2a2b44e0d0594ea939b1bcd8acade95 100644 --- a/services/applypatch/transfer_manager.cpp +++ b/services/applypatch/transfer_manager.cpp @@ -42,6 +42,9 @@ bool TransferManager::CommandsExecute(int fd, Command &cmd) return false; } CommandResult ret = cf->Execute(cmd); + if (!cmd.GetTransferParams()->canWrite) { + return ret == SUCCESS; + } if (!CheckResult(ret, cmd.GetCommandLine(), cmd.GetCommandType())) { return false; } @@ -188,12 +191,17 @@ bool TransferManager::CheckResult(const CommandResult result, const std::string } break; case NEED_RETRY: - LOG(INFO) << "Running command need retry!"; + LOG(INFO) << "IO failed. Running command need retry!"; if (transferParams_->env != nullptr) { transferParams_->env->PostMessage("retry_update", IO_FAILED_REBOOT); } return false; case FAILED: + LOG(INFO) << "Block update failed. Running command need retry!"; + if (transferParams_->env != nullptr) { + transferParams_->env->PostMessage("retry_update", BLOCK_UPDATE_FAILED_REBOOT); + } + return false; default: LOG(ERROR) << "Running command failed"; return false; diff --git a/services/fs_manager/mount.cpp b/services/fs_manager/mount.cpp index bb9f462db0f0a39b7a937bdd83efd306d7c1104f..4b84c1d9c40de22a6792dece7d13c08bcd7e2656 100644 --- a/services/fs_manager/mount.cpp +++ b/services/fs_manager/mount.cpp @@ -123,11 +123,8 @@ int UmountForPath(const std::string& path) } return 0; } - -static int MountNtfsWithRetry(std::string source, std::string target) +static int LoopToMount(char *argv[], std::string source, std::string target) { - char *argv[] = {const_cast("system/bin/mount.ntfs"), - const_cast(source.c_str()), const_cast(target.c_str()), nullptr}; int num = 0; do { pid_t child = fork(); @@ -164,6 +161,20 @@ static int MountNtfsWithRetry(std::string source, std::string target) return -1; } +static int MountNtfsWithRetry(std::string source, std::string target) +{ + char *argv[] = {const_cast("system/bin/mount.ntfs"), + const_cast(source.c_str()), const_cast(target.c_str()), nullptr}; + return LoopToMount(argv, source, target); +} + +static int MountExfatWithRetry(std::string source, std::string target) +{ + char *argv[] = {const_cast("system/bin/mount.exfat"), + const_cast(source.c_str()), const_cast(target.c_str()), nullptr}; + return LoopToMount(argv, source, target); +} + int MountSdcard(std::string &path, std::string &mountPoint) { if (path.empty() || mountPoint.empty()) { @@ -188,6 +199,10 @@ int MountSdcard(std::string &path, std::string &mountPoint) LOG(INFO) << "mount success, sdcard type is ntfs"; return 0; } + if (MountExfatWithRetry(path, mountPoint) == 0) { + LOG(INFO) << "mount success, sdcard type is exfat"; + return 0; + } return -1; } diff --git a/services/hwfault_retry/hwfault_retry.cpp b/services/hwfault_retry/hwfault_retry.cpp index 433af9c55a181b4c2a24643010f1366d3b6457eb..2b67adbc77b5a562881caa6f34a7f617e8ba46f3 100644 --- a/services/hwfault_retry/hwfault_retry.cpp +++ b/services/hwfault_retry/hwfault_retry.cpp @@ -37,6 +37,7 @@ HwFaultRetry::HwFaultRetry() }; RegisterFunc(VERIFY_FAILED_REBOOT, rebootFunc); RegisterFunc(IO_FAILED_REBOOT, rebootFunc); + RegisterFunc(BLOCK_UPDATE_FAILED_REBOOT, rebootFunc); } void HwFaultRetry::RegisterFunc(const std::string &faultInfo, RetryFunc func) @@ -66,8 +67,17 @@ void HwFaultRetry::SetRetryCount(const uint32_t count) retryCount_ = count; } +void HwFaultRetry::SetEffectiveValue(bool value) +{ + effective_ = value; +} + void HwFaultRetry::RebootRetry() { + if (!effective_) { + LOG(WARNING) << "Special scenarios do not take effect, not need retry."; + return; + } if (retryCount_ >= MAX_RETRY_COUNT) { LOG(INFO) << "retry more than 3 times, no need retry"; return; diff --git a/services/include/log/dump.h b/services/include/log/dump.h index cc200e5f2139a8df8a322c9b9a202ec189f917a9..67bb257005ffb52c9094e302715b6a5c3f682793 100644 --- a/services/include/log/dump.h +++ b/services/include/log/dump.h @@ -29,11 +29,13 @@ #define UPDATER_LAST_WORD Updater::Dump::GetInstance().DumpInfo #define UPDATER_INIT_RECORD DumpStageHelper stageHelper(__FUNCTION__) +#define UPDATER_CLEAR_RECORD Updater::Dump::GetInstance().ClearDump() namespace Updater { class DumpHelper { public: virtual void RecordDump(const std::string &str) = 0; + virtual void ClearDump(void) = 0; virtual ~DumpHelper() {} }; @@ -43,6 +45,7 @@ public: { LOG(ERROR) << str; } + void ClearDump(void) override {} ~DumpHelperLog() override {} }; @@ -68,6 +71,14 @@ public: } } } + void ClearDump(void) + { + for (const auto &[key, value] : helpers_) { + if (value != nullptr) { + value->ClearDump(); + } + } + } private: Dump() {} diff --git a/services/include/updater/hwfault_retry.h b/services/include/updater/hwfault_retry.h index 2927b6a5a6718f92bb42ab3f67d77ace0a2d5a78..b0711dda4cd4293b153bdb0ce94d0f0e22c7c684 100644 --- a/services/include/updater/hwfault_retry.h +++ b/services/include/updater/hwfault_retry.h @@ -33,6 +33,7 @@ public: void RegisterFunc(const std::string &faultInfo, RetryFunc func); void SetFaultInfo(const std::string &faultInfo); void SetRetryCount(const uint32_t count); + void SetEffectiveValue(bool value); private: void RebootRetry(); @@ -40,6 +41,7 @@ private: std::unordered_map retryMap_; std::string faultInfo_; uint32_t retryCount_ {}; + bool effective_ = true; }; } // Updater #endif // UPDATER_HWFAULT_RETRY_H diff --git a/services/include/updater/updater_const.h b/services/include/updater/updater_const.h index ad6a29e78bbb8ce9106fd0735508dd146c669a68..2496e4bc8c9d2bd9d9fbf50fb7eaaaad2bf04d17 100644 --- a/services/include/updater/updater_const.h +++ b/services/include/updater/updater_const.h @@ -82,6 +82,7 @@ constexpr const char *MMC_SIZE_FILE = "/data/class/block/mmcblk0/size"; constexpr const char *UPDATER_RETRY_TAG = "retry_update"; constexpr const char *VERIFY_FAILED_REBOOT = "reboot_verify_failed"; constexpr const char *IO_FAILED_REBOOT = "reboot_IO_failed"; +constexpr const char *BLOCK_UPDATE_FAILED_REBOOT = "reboot_block_update_failed"; constexpr int MAX_RETRY_COUNT = 3; constexpr int MINIMAL_ARGC_LIMIT = 2; diff --git a/services/package/pkg_verify/openssl_util.cpp b/services/package/pkg_verify/openssl_util.cpp index e73d4f1c7d652ef58a72044b3cf43567c1e3f377..a2ed3711917ba21fd026d4989a08b216b9620018 100644 --- a/services/package/pkg_verify/openssl_util.cpp +++ b/services/package/pkg_verify/openssl_util.cpp @@ -218,11 +218,11 @@ int32_t CalcSha256Digest(const PkgStreamPtr srcData, const size_t dataLen, std:: UPDATER_LAST_WORD(-1); return -1; } - SHA256_Update(&ctx, buffer.buffer, blockLen); + SHA256_Update(&ctx, buffer.buffer, readLen); offset += readLen; remainLen -= readLen; } - if (remainLen > 0) { + while (remainLen > 0) { ret = srcData->Read(buffer, offset, remainLen, readLen); if (ret != 0) { PKG_LOGE("Fail read data"); @@ -230,6 +230,9 @@ int32_t CalcSha256Digest(const PkgStreamPtr srcData, const size_t dataLen, std:: return -1; } SHA256_Update(&ctx, buffer.buffer, readLen); + offset += readLen; + PKG_LOGI("use new remainLen"); + remainLen -= readLen; } if (SHA256_Final(result.data(), &ctx) != 1) { diff --git a/services/package/pkg_verify/pkg_verify_util.cpp b/services/package/pkg_verify/pkg_verify_util.cpp index 7e28cfd882db8d34468a9ff313a3fa4ed5afd84b..596c7bc49807b445aac8c4466f05eb458e4dc0c2 100644 --- a/services/package/pkg_verify/pkg_verify_util.cpp +++ b/services/package/pkg_verify/pkg_verify_util.cpp @@ -120,11 +120,14 @@ int32_t PkgVerifyUtil::VerifyPackageSign(const PkgStreamPtr pkgStream, const std } size_t srcDataLen = pkgStream->GetFileLength() - commentTotalLenAll - 2; - ret = HashCheck(pkgStream, srcDataLen, hash, path); + ret = HashCheck(pkgStream, srcDataLen, hash, path); if (ret != PKG_SUCCESS) { srcDataLen = pkgStream->GetFileLength() - signatureSize - ZIP_EOCD_FIXED_PART_LEN; ret = HashCheck(pkgStream, srcDataLen, hash, path); } + if (ret == PKG_SUCCESS) { + UPDATER_CLEAR_RECORD; + } PKG_LOGI("verify package signature %s", ret == PKG_SUCCESS ? "successfull" : "failed"); return ret; } diff --git a/services/ptable_parse/ufs_ptable.cpp b/services/ptable_parse/ufs_ptable.cpp index cfda373b524932e5dd64c3fb0a870a65b8c5b256..0c6e7e0178ccffa462e1246597ee14a2c470bddf 100644 --- a/services/ptable_parse/ufs_ptable.cpp +++ b/services/ptable_parse/ufs_ptable.cpp @@ -45,6 +45,21 @@ uint32_t UfsPtable::GetPtableExtraOffset(void) } // avoid u disk being recognized as a valid gpt lun device +bool UfsPtable::IsUsbPath(const uint32_t lunIndex) +{ + char lunIndexName = 'a' + lunIndex; + const char* targetUsbString = "usb"; + const char* targetXhciString = "xhci"; + char linkBuf[READ_LINK_BUFFER_LENTH] = {0}; + std::string filePath = std::string(PREFIX_SYS_CLASS_BLOCK) + lunIndexName; + ssize_t retSize = readlink(filePath.c_str(), linkBuf, READ_LINK_BUFFER_LENTH - 1); + LOG(INFO) << "readlink " << filePath << " retSzie " << retSize << ", linkBuf is: " << linkBuf; + if (retSize > 0 && (strstr(linkBuf, targetUsbString) != nullptr || strstr(linkBuf, targetXhciString) != nullptr)) { + return true; + } + return false; +} + bool UfsPtable::CheckDeviceLunRemoveable(const uint32_t lunIndex) { constexpr uint32_t minRemoveableStartIdx = 3; @@ -88,7 +103,7 @@ void UfsPtable::SetDeviceLunNum() break; } #ifndef UPDATER_UT - if (CheckDeviceLunRemoveable(lunIndex)) { + if (CheckDeviceLunRemoveable(lunIndex) || IsUsbPath(lunIndex)) { LOG(ERROR) << "device " << ufsNode << " is removable, may be a u disk"; break; } diff --git a/services/ptable_parse/ufs_ptable.h b/services/ptable_parse/ufs_ptable.h index b0180f9129f483c7cc184e605913c8dfc2bf0417..f6ee78090190d434458ed82295978e7feb53147c 100644 --- a/services/ptable_parse/ufs_ptable.h +++ b/services/ptable_parse/ufs_ptable.h @@ -41,6 +41,7 @@ public: static constexpr uint32_t MAX_LUN_NUMBERS = 26; static constexpr uint32_t MIN_UFS_WRITE_SIZE = 4096; static constexpr uint32_t GPT_PTABLE_BACKUP_SIZE = 33; // back ptable at the end of lun + static constexpr uint32_t READ_LINK_BUFFER_LENTH = 1024; // readlink buffer size struct UfsPartitionDataInfo { bool isGptVaild; @@ -77,6 +78,7 @@ public: uint8_t *GetPtableImageUfsLunPmbrStart(uint8_t *imageBuf, const uint32_t lunIndex); uint8_t *GetPtableImageUfsLunGptHeaderStart(uint8_t *imageBuf, const uint32_t lunIndex); uint8_t *GetPtableImageUfsLunEntryStart(uint8_t *imageBuf, const uint32_t lunIndex); + bool IsUsbPath(const uint32_t lunIndex); }; } // namespace Updater #endif // UPDATER_UFS_PTABLE_H \ No newline at end of file diff --git a/services/script/script_interpreter/script_interpreter.cpp b/services/script/script_interpreter/script_interpreter.cpp index 5eb733095049648c3ce736b4f8571260710a0fcb..edb3a2e31731a334a50e259febcf8420b18e772d 100644 --- a/services/script/script_interpreter/script_interpreter.cpp +++ b/services/script/script_interpreter/script_interpreter.cpp @@ -42,6 +42,8 @@ int32_t ScriptInterpreter::ExecuteScript(ScriptManagerImpl *manager, Hpackage::P } int32_t ret = inter->LoadScript(pkgStream); if (ret != USCRIPT_SUCCESS) { + delete inter; + inter = nullptr; USCRIPT_LOGE("Fail to loadScript script %s", pkgStream->GetFileName().c_str()); UPDATER_LAST_WORD(USCRIPT_ERROR_CREATE_OBJ); return ret; diff --git a/services/updater.cpp b/services/updater.cpp index 3644eace32ffdc7b2c52f6f960d78dad399d21cb..ce59f33f6d5c848a69239d1c1afb5aab90b08caa 100644 --- a/services/updater.cpp +++ b/services/updater.cpp @@ -294,10 +294,12 @@ UpdaterStatus DoInstallUpdaterPackage(PkgManager::PkgManagerPtr pkgManager, Upda int ret = GetUpdatePackageInfo(pkgManager, upParams.updatePackage[upParams.pkgLocation]); if (ret != 0) { LOG(ERROR) << "get update package info fail"; + UPDATER_LAST_WORD(UPDATE_CORRUPT, "GetUpdatePackageInfo failed"); return UPDATE_CORRUPT; } if (!PreStartBinaryEntry(upParams.updatePackage[upParams.pkgLocation])) { LOG(ERROR) << "pre binary process failed"; + UPDATER_LAST_WORD(UPDATE_ERROR, "PreStartBinaryEntry failed"); return UPDATE_ERROR; } @@ -305,6 +307,7 @@ UpdaterStatus DoInstallUpdaterPackage(PkgManager::PkgManagerPtr pkgManager, Upda UpdaterStatus updateRet = StartUpdaterProc(pkgManager, upParams); if (updateRet != UPDATE_SUCCESS) { UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_INSTALL_FAIL)); + UPDATER_LAST_WORD(updateRet, "StartUpdaterProc failed"); LOG(ERROR) << "Install package failed."; } if (WriteResult(upParams.updatePackage[upParams.pkgLocation], @@ -418,6 +421,7 @@ UpdaterStatus HandlePipeMsg(UpdaterParams &upParams, int pipeRead, bool &retryUp FILE* fromChild = fdopen(pipeRead, "r"); if (fromChild == nullptr) { LOG(ERROR) << "fdopen pipeRead failed"; + UPDATER_LAST_WORD(UPDATE_ERROR); return UPDATE_ERROR; } while (fgets(buffer, MAX_BUFFER_SIZE - 1, fromChild) != nullptr) { @@ -501,7 +505,7 @@ UpdaterStatus StartUpdaterProc(PkgManager::PkgManagerPtr pkgManager, UpdaterPara pid_t pid = fork(); if (pid < 0) { ERROR_CODE(CODE_FORK_FAIL); - UPDATER_LAST_WORD(UPDATE_ERROR); + UPDATER_LAST_WORD(UPDATE_ERROR, "fork failed"); return UPDATE_ERROR; } diff --git a/services/updater_main.cpp b/services/updater_main.cpp index 8abf00a4bfa38394fb81f820ed752aa438d9238d..1524651444245879b1e6bd11b957d0f4eb61f515 100644 --- a/services/updater_main.cpp +++ b/services/updater_main.cpp @@ -707,6 +707,7 @@ std::unordered_map> InitOptionsFuncTab(char* {"sdcard_update", [&]() -> void { upParams.updateMode = SDCARD_UPDATE; + upParams.sdExtMode = SDCARD_NORMAL_UPDATE; }}, {"UPDATE:MAINIMG", [&]() -> void { diff --git a/test/unittest/flashd_test/BUILD.gn b/test/unittest/flashd_test/BUILD.gn index 49a51a146b66486b8931e28f3ca8d745057e683d..6fb16a940051ed37e452c73618aa440c1da430e4 100644 --- a/test/unittest/flashd_test/BUILD.gn +++ b/test/unittest/flashd_test/BUILD.gn @@ -83,11 +83,6 @@ ohos_unittest("flashd_unittest") { "${updater_path}/services/ptable_parse", "${updater_path}/utils/include", "${updater_path}/utils/json", - "//base/startup/init/services/include/param", - "//third_party/bounds_checking_function/include", - "//third_party/cJSON", - "//third_party/lz4/lib", - "//third_party/libuv", ] deps = [ @@ -103,21 +98,23 @@ ohos_unittest("flashd_unittest") { "${updater_path}/services/package:libupdaterpackage", "${updater_path}/services/script:libupdaterscript", "${updater_path}/utils:libutils", - "//third_party/bounds_checking_function:libsec_static", - "//third_party/bzip2:libbz2", - "//third_party/cJSON:cjson", - "//third_party/googletest:gmock_main", - "//third_party/googletest:gtest_main", - "//third_party/libuv:uv", - "//third_party/lz4:liblz4_static", - "//third_party/openssl:libcrypto_shared", - "//third_party/zlib:libz", ] external_deps = [ + "bounds_checking_function:libsec_static", + "bzip2:libbz2", + "cJSON:cjson", + "googletest:gmock_main", + "googletest:gtest_main", "hilog:libhilog", "init:libbegetutil_static", + "libuv:uv", + "lz4:liblz4_static", + "openssl:libcrypto_shared", ] + if (updater_zlib_enable) { + external_deps += [ "zlib:libz" ] + } configs = [ "${updater_path}/test/unittest:utest_config" ] install_enable = true part_name = "updater" @@ -139,7 +136,6 @@ ohos_unittest("flashd_utils_unittest") { "${updater_path}/services/include", "${updater_path}/utils/include", "${updater_path}/services/flashd", - "//third_party/libuv", "${updater_path}/interfaces/kits/include", "${updater_path}/services/common", "${updater_path}/services/flashd/common", @@ -149,8 +145,9 @@ ohos_unittest("flashd_utils_unittest") { "c_utils:utils", "hilog:libhilog", "init:libbegetutil_static", + "libuv:uv", ] - deps = [ "//third_party/libuv:uv" ] + deps = [] configs = [ "${updater_path}/test/unittest:utest_config" ] install_enable = true part_name = "updater" diff --git a/test/unittest/package/pkg_verify_unittest.cpp b/test/unittest/package/pkg_verify_unittest.cpp index 33e86a189424118bad3a1ff0d19dc6f8b35e9b19..d3f583f5a18acb3d7601b06d2dbb6a67ef1f1aa6 100644 --- a/test/unittest/package/pkg_verify_unittest.cpp +++ b/test/unittest/package/pkg_verify_unittest.cpp @@ -64,7 +64,7 @@ public: packagePath = testPackagePath + "test_package.zip"; keyPath = "/data/updater/src/signing_cert.crt"; - file = "updater.bin"; + file = "update.bin"; ret = ExtraPackageFile(packagePath.c_str(), keyPath.c_str(), file.c_str(), testPackagePath.c_str()); EXPECT_EQ(ret, PKG_SUCCESS); return 0; diff --git a/test/unittest/updater_test/hwfault_retry_unittest.cpp b/test/unittest/updater_test/hwfault_retry_unittest.cpp index aca888c06ecb50760433b71ca5cfa321aa7cef96..b65e82df7132c6cc6a410804585fa685c2e140a8 100644 --- a/test/unittest/updater_test/hwfault_retry_unittest.cpp +++ b/test/unittest/updater_test/hwfault_retry_unittest.cpp @@ -76,4 +76,14 @@ HWTEST_F(HwfaultRetryUnitTest, RetryMoreThanMax, TestSize.Level1) bool ret = Utils::CheckFaultInfo(IO_FAILED_REBOOT); EXPECT_EQ(ret, false); } + +HWTEST_F(HwfaultRetryUnitTest, SetEffectiveValueTest, TestSize.Level1) +{ + HwFaultRetry::GetInstance().SetEffectiveValue(false); + HwFaultRetry::GetInstance().SetFaultInfo(VERIFY_FAILED_REBOOT); + HwFaultRetry::GetInstance().SetRetryCount(0); + HwFaultRetry::GetInstance().DoRetryAction(); + + EXPECT_FALSE(Utils::CheckFaultInfo(VERIFY_FAILED_REBOOT)); +} } \ No newline at end of file diff --git a/updater_default_cfg.gni b/updater_default_cfg.gni index 2f8f2101ab1e41f6054839b551aeca236f017ae7..4f84e9f209e4975b037210e40543cd5e11e7766a 100644 --- a/updater_default_cfg.gni +++ b/updater_default_cfg.gni @@ -24,6 +24,12 @@ declare_args() { updater_absolutely_path = "//base/update/updater" hdc_base = "//developtools/hdc" updater_sign_on_server = false + updater_zlib_enable = true + + if (defined(global_parts_info) && + !defined(global_parts_info.third_party_zlib)) { + updater_zlib_enable = false + } } if (updater_cfg_file != "") {