diff --git a/frameworks/native/backup_ext/src/tar_file.cpp b/frameworks/native/backup_ext/src/tar_file.cpp index aa1ebee0d791db60bebe4ff751123d2d3e011507..56e09079b4b794945f097f4aee7b4aa56e2f06c4 100644 --- a/frameworks/native/backup_ext/src/tar_file.cpp +++ b/frameworks/native/backup_ext/src/tar_file.cpp @@ -37,8 +37,10 @@ const uint64_t MAX_FILE_SIZE = 0777777777777L; const uint32_t OCTSTR_LEN = sizeof(off_t) * 3 + 1; const uint32_t DEFAULT_SLICE_SIZE = 100 * MB_TO_BYTE; // 分片文件大小为100M const uint32_t MAX_FILE_COUNT = 6000; // 单个tar包最多包含6000个文件 +const uint32_t PATH_MAX_LEN = 2048; const string VERSION = "1.0"; const string LONG_LINK_SYMBOL = "longLinkSymbol"; +const char SLASH = '/'; } // namespace TarFile &TarFile::GetInstance() @@ -49,7 +51,7 @@ TarFile &TarFile::GetInstance() bool TarFile::Packet(const vector &srcFiles, const string &tarFileName, const string &pkPath, TarMap &tarMap) { - if (srcFiles.empty() || tarFileName.empty() || pkPath.empty()) { + if (tarFileName.empty() || pkPath.empty()) { HILOGE("Invalid parameter"); return false; } @@ -91,7 +93,7 @@ bool TarFile::TraversalFile(string &filePath) HILOGE("File path does not exists, err = %{public}d", errno); return false; } - + HILOGE("TraversalFile, filename=%{public}s", filePath.c_str()); struct stat curFileStat {}; memset_s(&curFileStat, sizeof(curFileStat), 0, sizeof(curFileStat)); if (lstat(filePath.c_str(), &curFileStat) != 0) { @@ -108,7 +110,7 @@ bool TarFile::TraversalFile(string &filePath) FillSplitTailBlocks(); CreateSplitTarFile(); } - + HILOGE("TraversalFile2, filename=%{public}s", filePath.c_str()); // tar包内文件数量大于6000,分片打包 fileCount_++; if (fileCount_ == MAX_FILE_COUNT) { @@ -163,10 +165,17 @@ bool TarFile::AddFile(string &fileName, const struct stat &st, bool isSplit) HILOGE("Failed to I2OcsConvert"); return false; } - + HILOGE("AddFile, filename=%{public}s", fileName.c_str()); if (strncpy_s(hdr.name, sizeof(hdr.name), fileName.c_str(), sizeof(hdr.name) - 1) == 0) { - if (fileName.length() >= sizeof(hdr.name)) { - WriteLongName(fileName, GNUTYPE_LONGNAME); + string absname(fileName); + absname.replace(absname.begin(), absname.begin() + PATH_MAX_LEN + 1, ""); + if (S_ISDIR(st.st_mode)) { + absname += SLASH; + } + HILOGE("AddFile1, absname=%{public}s, length=%{public}d", absname.c_str(), absname.length()); + if (absname.length() >= sizeof(hdr.name)) { + WriteLongName(absname, GNUTYPE_LONGNAME); + HILOGE("AddFile2, absname=%{public}s, length=%{public}d", absname.c_str(), absname.length()); } } memcpy_s(hdr.magic, sizeof(hdr.magic), TMAGIC.c_str(), sizeof(hdr.magic) - 1); @@ -193,6 +202,7 @@ bool TarFile::AddFile(string &fileName, const struct stat &st, bool isSplit) HILOGE("Failed to write file content"); return false; } + HILOGE("AddFile3, filename2=%{public}s, currentFileName=%{public}s", fileName.c_str(), currentFileName_.c_str()); currentFileName_ = ""; return true; } @@ -217,13 +227,13 @@ bool TarFile::WriteFileContent(const string &fileName, off_t size) } } // read buffer from src file - if (ReadAll(fd, ioBuffer_, size) != read) { + if (ReadAll(fd, ioBuffer_, read) != (int)read) { HILOGE("Failed to read all"); break; } // write buffer to tar file - if (SplitWriteAll(ioBuffer_, read, isFilled) != read) { + if (SplitWriteAll(ioBuffer_, (int)read, isFilled) != (int)read) { HILOGE("Failed to split write all"); break; } @@ -244,7 +254,7 @@ bool TarFile::WriteFileContent(const string &fileName, off_t size) int TarFile::SplitWriteAll(const vector &ioBuffer, int read, bool &isFilled) { size_t len = ioBuffer.size(); - if (len > read) { + if ((int)len > read) { len = read; } size_t count = 0; @@ -326,11 +336,7 @@ void TarFile::SetCheckSum(TarHeader &hdr) buffer.resize(sizeof(hdr)); buffer.assign(reinterpret_cast(&hdr), reinterpret_cast(&hdr) + sizeof(hdr)); for (int index = 0; index < BLOCK_SIZE; index++) { - if (index < CHKSUM_BASE || index > CHKSUM_BASE + CHKSUM_LEN - 1) { - sum += (buffer[index] & 0xFF); - } else { - sum += BLANK_SPACE; - } + sum += (buffer[index] & 0xFF); } memcpy_s(hdr.chksum, sizeof(hdr.chksum), I2Ocs(sizeof(hdr.chksum), sum).c_str(), sizeof(hdr.chksum) - 1); } @@ -411,6 +417,7 @@ string TarFile::I2Ocs(int len, off_t val) bool TarFile::WriteLongName(string &name, char type) { + HILOGE("WriteLongName1, filename=%{public}s", name.c_str()); // fill tar header for long name TarHeader tmp; memset_s(&tmp, sizeof(tmp), 0, sizeof(tmp)); @@ -453,7 +460,7 @@ bool TarFile::WriteLongName(string &name, char type) if (WriteTarHeader(tmp) != BLOCK_SIZE) { return false; } - + HILOGE("WriteLongName3, filename=%{public}s", name.c_str()); // write name to archive vector buffer {}; buffer.resize(sz); @@ -461,7 +468,7 @@ bool TarFile::WriteLongName(string &name, char type) if (WriteAll(buffer, sz) != sz) { return false; } - + HILOGE("WriteLongName4, name=%{public}s", name.c_str()); return CompleteBlock(sz); } diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index 1154b0727e4bea6d604da428431c2454f432e4e3..ce4cce4ac79001af2e95b746391d67e901b6e70c 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -61,14 +61,30 @@ static tuple, vector> GetDirFilesDetai vector smallFiles; if (IsEmptyDirectory(path)) { - smallFiles.emplace_back(path); + string newPath = path; + if (path.at(path.size()-1) != '/') { + newPath += '/'; + } + smallFiles.emplace_back(newPath); return {ERR_OK, files, smallFiles}; } unique_ptr> dir = {opendir(path.c_str()), closedir}; if (!dir) { - HILOGE("Invalid directory path: %{private}s", path.c_str()); - return {BError(errno).GetCode(), files, smallFiles}; + // 如果是文件,也添加进来 + HILOGE("not directory path: %{private}s", path.c_str()); + struct stat sta = {}; + if (stat(path.data(), &sta) == -1) { + return {BError(errno).GetCode(), files, smallFiles}; + } + if (sta.st_size <= size) { + HILOGE("Find small file %{public}s", path.c_str()); + smallFiles.emplace_back(path); + } else { + HILOGE("Find big file %{public}s", path.c_str()); + files.try_emplace(path, sta); + } + return {BError(BError::Codes::OK).GetCode(), files, smallFiles}; } struct dirent *ptr = nullptr; @@ -132,7 +148,7 @@ tuple> BDir::GetDirFiles(const string &path) return {ERR_OK, files}; } -static set ExpandPathWildcard(const vector &vec) +static set ExpandPathWildcard(const vector &vec, bool onlyPath) { unique_ptr> gl {new glob_t, [](glob_t *ptr) { globfree(ptr); }}; *gl = {}; @@ -152,7 +168,7 @@ static set ExpandPathWildcard(const vector &vec) for (auto it = expandPath.begin(); it != expandPath.end(); ++it) { filteredPath.insert(*it); - if (*it->rbegin() != '/') { + if (onlyPath && *it->rbegin() != '/') { continue; } auto jt = it; @@ -168,7 +184,7 @@ static set ExpandPathWildcard(const vector &vec) tuple, vector> BDir::GetBigFiles(const vector &includes, const vector &excludes) { - set inc = ExpandPathWildcard(includes); + set inc = ExpandPathWildcard(includes, false); map incFiles; vector incSmallFiles; @@ -189,7 +205,11 @@ tuple, vector> BDir::GetBigFiles(const return false; } for (const string &item : s) { - if (!item.empty() && (fnmatch(item.data(), str.data(), FNM_LEADING_DIR) == 0)) { + string excludeItem = item; + if (excludeItem.at(item.size() - 1) == '/') { + excludeItem += "*"; + } + if (!item.empty() && fnmatch(excludeItem.data(), str.data(), FNM_LEADING_DIR) == 0) { HILOGI("file %{public}s matchs exclude condition", str.c_str()); return true; } @@ -197,6 +217,14 @@ tuple, vector> BDir::GetBigFiles(const return false; }; + vector resSmallFiles; + for (const auto &item : incSmallFiles) { + if (!isMatch(excludes, item)) { + HILOGI("smallfile %{public}s matchs include condition and unmatchs exclude condition", item.c_str()); + resSmallFiles.insert(resSmallFiles.end(), item); + } + } + map bigFiles; for (const auto &item : incFiles) { if (!isMatch(excludes, item.first)) { @@ -205,14 +233,14 @@ tuple, vector> BDir::GetBigFiles(const } } HILOGI("total number of big files is %{public}d", static_cast(bigFiles.size())); - HILOGI("total number of small files is %{public}d", static_cast(incSmallFiles.size())); - return {ERR_OK, move(bigFiles), move(incSmallFiles)}; + HILOGI("total number of small files is %{public}d", static_cast(resSmallFiles.size())); + return {ERR_OK, move(bigFiles), move(resSmallFiles)}; } vector BDir::GetDirs(const vector &paths) { vector wildcardPath(paths.begin(), paths.end()); - set inc = ExpandPathWildcard(wildcardPath); + set inc = ExpandPathWildcard(wildcardPath, true); vector dirs(inc.begin(), inc.end()); return dirs; } diff --git a/utils/src/b_json/b_json_entity_extension_config.cpp b/utils/src/b_json/b_json_entity_extension_config.cpp index 4c9a845e8b2007e35e9d1413315eb6920ff284d3..8e87fa30299db725df24d5c15bfd92101b05410a 100644 --- a/utils/src/b_json/b_json_entity_extension_config.cpp +++ b/utils/src/b_json/b_json_entity_extension_config.cpp @@ -47,7 +47,7 @@ vector BJsonEntityExtensionConfig::GetIncludes() const vector dirs; for (auto &&item : obj_["includes"]) { - if (!item.isString()) { + if (!item.isString() || item.empty()) { HILOGE("Each item of array 'includes' must be of the type string"); continue; }