diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index c8bd321cdddc29985a3fd505c5df2c961325f6cd..12d08e820c67cf6facc81812f35879343ba580de 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -187,9 +187,9 @@ private: void AsyncTaskDoIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd); void AsyncTaskOnIncrementalBackup(); int DoIncrementalBackupTask(UniqueFd incrementalFd, UniqueFd manifestFd); - ErrCode IncrementalBigFileReady(const TarMap &pkgInfo, const vector &bigInfos, + ErrCode IncrementalBigFileReady(TarMap &pkgInfo, const vector &bigInfos, sptr proxy); - ErrCode BigFileReady(const TarMap &bigFileInfo, sptr proxy); + ErrCode BigFileReady(TarMap &bigFileInfo, sptr proxy); void WaitToSendFd(std::chrono::system_clock::time_point &startTime, int &fdSendNum); void RefreshTimeInfo(std::chrono::system_clock::time_point &startTime, int &fdSendNum); void IncrementalPacket(const vector &infos, TarMap &tar, sptr proxy); @@ -289,6 +289,7 @@ private: ErrCode GetIncreFileHandleForNormalVersion(const std::string &fileName); void RestoreOneBigFile(const std::string &path, const ExtManageInfo &item, const bool appendTargetPath); int DealIncreRestoreBigAndTarFile(); + void ClearNoPermissionFiles(TarMap &pkgInfo, vector &noPermissionFiles); std::function ReportOnProcessResultCallback(wptr obj, BackupRestoreScenario scenario); diff --git a/frameworks/native/backup_ext/include/tar_file.h b/frameworks/native/backup_ext/include/tar_file.h index 2d19e241e20b368869d3a0419f3b6c3366d529aa..27c798966aeeedee3e97484a69fa0a42be94f796 100644 --- a/frameworks/native/backup_ext/include/tar_file.h +++ b/frameworks/native/backup_ext/include/tar_file.h @@ -56,6 +56,7 @@ const char AREGTYPE = '\0'; // regular file const char SYMTYPE = '2'; // reserved const char DIRTYPE = '5'; // directory const char GNUTYPE_LONGNAME = 'L'; +const int ERR_NO_PERMISSION = 13; } // namespace // 512 bytes @@ -215,6 +216,8 @@ private: */ bool I2OcsConvert(const struct stat &st, TarHeader &hdr, std::string &fileName); + bool ToAddFile(std::string &path, int &err); + private: uint32_t fileCount_ {0}; TarMap tarMap_ {}; diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index c3dbed240a48da8c21174dbd6eabe6d904dcc061..f43481798073f3b8f28483d81f13635c44b3d020 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -467,13 +467,27 @@ static ErrCode IndexFileReady(const TarMap &pkgInfo, sptr proxy) return ret; } -ErrCode BackupExtExtension::BigFileReady(const TarMap &bigFileInfo, sptr proxy) +void BackupExtExtension::ClearNoPermissionFiles(TarMap &pkgInfo, vector &noPermissionFiles) +{ + HILOGI("start ClearNoPermissionFiles;"); + for (const auto &item : noPermissionFiles) { + auto it = pkgInfo.find(item); + if (it != pkgInfo.end()) { + HILOGI("noPermissionFile, don't need to backup, path = %{public}s", + GetAnonyString(std::get<0>(it->second)).c_str()); + pkgInfo.erase(it); + } + } +} + +ErrCode BackupExtExtension::BigFileReady(TarMap &bigFileInfo, sptr proxy) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("BigFileReady Begin: bigFileInfo file size is: %{public}zu", bigFileInfo.size()); ErrCode ret {ERR_OK}; auto startTime = std::chrono::system_clock::now(); int fdNum = 0; + vector noPermissionFiles; for (auto &item : bigFileInfo) { WaitToSendFd(startTime, fdNum); int32_t errCode = ERR_OK; @@ -482,8 +496,11 @@ ErrCode BackupExtExtension::BigFileReady(const TarMap &bigFileInfo, sptrAppFileReady(item.first, std::move(fd), errCode); if (SUCCEEDED(ret)) { HILOGI("The application is packaged successfully, package name is %{public}s", item.first.c_str()); @@ -493,6 +510,7 @@ ErrCode BackupExtExtension::BigFileReady(const TarMap &bigFileInfo, sptrGetExtensionAction() != BConstants::ExtensionAction::RESTORE) { - HILOGE("Failed to publish file, action is invalid"); throw BError(BError::Codes::EXT_INVAL_ARG, "Action is invalid"); } VerifyCaller(); @@ -537,11 +553,9 @@ ErrCode BackupExtExtension::PublishIncrementalFile(const string &fileName) HILOGI("begin publish incremental file. fileName is %{private}s", fileName.data()); try { if (extension_ == nullptr) { - HILOGE("Failed to publish incremental file, extension is nullptr"); throw BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr"); } if (extension_->GetExtensionAction() != BConstants::ExtensionAction::RESTORE) { - HILOGE("Failed to publish incremental file, action is invalid"); throw BError(BError::Codes::EXT_INVAL_ARG, "Action is invalid"); } VerifyCaller(); @@ -732,7 +746,6 @@ int BackupExtExtension::DoBackup(const BJsonEntityExtensionConfig &usrConfig) HILOGI("Start Do backup"); auto start = std::chrono::system_clock::now(); if (extension_ == nullptr) { - HILOGE("Failed to do backup, extension is nullptr"); throw BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr"); } if (extension_->GetExtensionAction() != BConstants::ExtensionAction::BACKUP) { @@ -791,7 +804,6 @@ int BackupExtExtension::DoRestore(const string &fileName, const off_t fileSize) HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("Do restore"); if (extension_ == nullptr) { - HILOGE("Failed to do restore, extension is nullptr"); throw BError(BError::Codes::EXT_INVAL_ARG, "Extension is nullptr"); } if (extension_->GetExtensionAction() != BConstants::ExtensionAction::RESTORE) { @@ -1920,13 +1932,14 @@ static ErrCode IncrementalTarFileReady(const TarMap &bigFileInfo, /** * 增量大文件和简报信息回传 */ -ErrCode BackupExtExtension::IncrementalBigFileReady(const TarMap &pkgInfo, +ErrCode BackupExtExtension::IncrementalBigFileReady(TarMap &pkgInfo, const vector &bigInfos, sptr proxy) { ErrCode ret {ERR_OK}; HILOGI("IncrementalBigFileReady Begin, pkgInfo size:%{public}zu", pkgInfo.size()); auto startTime = std::chrono::system_clock::now(); int fdNum = 0; + vector noPermissionFiles; for (auto &item : pkgInfo) { if (item.first.empty()) { continue; @@ -1939,6 +1952,10 @@ ErrCode BackupExtExtension::IncrementalBigFileReady(const TarMap &pkgInfo, HILOGE("IncrementalBigFileReady open file failed, file name is %{public}s, err = %{public}d", path.c_str(), errno); errCode = errno; + if (errCode == ERR_NO_PERMISSION) { + noPermissionFiles.emplace_back(item.first.c_str()); + continue; + } } vector bigInfo; for (const auto &tempFile : bigInfos) { @@ -1960,6 +1977,7 @@ ErrCode BackupExtExtension::IncrementalBigFileReady(const TarMap &pkgInfo, fdNum += BConstants::FILE_AND_MANIFEST_FD_COUNT; RefreshTimeInfo(startTime, fdNum); } + ClearNoPermissionFiles(pkgInfo, noPermissionFiles); HILOGI("IncrementalBigFileReady End"); return ret; } diff --git a/frameworks/native/backup_ext/src/tar_file.cpp b/frameworks/native/backup_ext/src/tar_file.cpp index 6f456bf84184a35f4396e467a211c7cb39144f32..539d35126fa5b4ee54b418a9a0e5b580d7fc0a48 100644 --- a/frameworks/native/backup_ext/src/tar_file.cpp +++ b/frameworks/native/backup_ext/src/tar_file.cpp @@ -100,30 +100,44 @@ bool TarFile::Packet(const vector &srcFiles, const string &tarFileName, return true; } -bool TarFile::TraversalFile(string &filePath, int &err) +bool TarFile::ToAddFile(std::string &path, int &err) { - if (access(filePath.c_str(), F_OK) != 0) { - err = errno; - HILOGE("File path does not exists, err = %{public}d", errno); - return false; - } - struct stat curFileStat {}; auto ret = memset_s(&curFileStat, sizeof(curFileStat), 0, sizeof(curFileStat)); if (ret != EOK) { HILOGE("Failed to call memset_s, err = %{public}d", ret); return false; } - if (lstat(filePath.c_str(), &curFileStat) != 0) { + if (lstat(path.c_str(), &curFileStat) != 0) { err = errno; HILOGE("Failed to lstat, err = %{public}d", errno); return false; } - if (!AddFile(filePath, curFileStat, err)) { - HILOGE("Failed to add file to tar package, file path is:%{public}s", GetAnonyPath(filePath).c_str()); + if (!AddFile(path, curFileStat, err)) { + HILOGE("Failed to add file to tar package, file path is:%{public}s", GetAnonyPath(path).c_str()); return false; } + return true; +} +bool TarFile::TraversalFile(string &filePath, int &err) +{ + if (access(filePath.c_str(), F_OK) != 0) { + err = errno; + HILOGE("File path does not exists, err = %{public}d", errno); + return false; + } + int fd = open(filePath.c_str(), O_RDONLY); + if (fd < 0 && errno == ERR_NO_PERMISSION) { + HILOGI("noPermissionFlie, don't need to backup, path = %{public}s, err = %{public}d", + GetAnonyString(filePath).c_str(), errno); + return true; + } else if (fd > 0) { + close(fd); + } + if (!ToAddFile(filePath, err)) { + return false; + } if (isReset_) { return true; }