From c6aa12421c250d0cafdd1279e6245fb1b5f019e5 Mon Sep 17 00:00:00 2001 From: y30045862 Date: Mon, 15 May 2023 20:26:57 +0800 Subject: [PATCH] bugfix_fs_listfile Signed-off-by: zhuhongtao12 Change-Id: I10f17b8106ad079b58d9f4237e4b41cfd47fb0fe --- .../js/src/mod_fs/properties/listfile.cpp | 132 ++++++++++-------- .../kits/js/src/mod_fs/properties/listfile.h | 12 +- utils/filemgmt_libn/src/n_val.cpp | 2 +- 3 files changed, 79 insertions(+), 67 deletions(-) diff --git a/interfaces/kits/js/src/mod_fs/properties/listfile.cpp b/interfaces/kits/js/src/mod_fs/properties/listfile.cpp index 40c4ea904..2b5ed9259 100644 --- a/interfaces/kits/js/src/mod_fs/properties/listfile.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/listfile.cpp @@ -17,7 +17,6 @@ #include #include -#include #include #include #include @@ -80,7 +79,7 @@ static bool GetFileFilterParam(const NVal &argv, OHOS::DistributedFS::FileFilter filter->SetDisplayName(displayNames); } if (argv.HasProp("fileSizeOver")) { - int64_t fileSizeOver; + int64_t fileSizeOver = 0; tie(ret, fileSizeOver) = argv.GetProp("fileSizeOver").ToInt64(); if (!ret || fileSizeOver < 0) { HILOGE("Failed to get fileSizeOver prop."); @@ -89,7 +88,7 @@ static bool GetFileFilterParam(const NVal &argv, OHOS::DistributedFS::FileFilter filter->SetFileSizeOver(fileSizeOver); } if (argv.HasProp("lastModifiedAfter")) { - double lastModifiedAfter; + double lastModifiedAfter = 0; tie(ret, lastModifiedAfter) = argv.GetProp("lastModifiedAfter").ToDouble(); if (!ret || lastModifiedAfter < 0) { HILOGE("Failed to get lastModifiedAfter prop."); @@ -149,7 +148,7 @@ static bool GetOptionArg(napi_env env, const NFuncArg &funcArg, OptionArgs &opti return true; } -static bool FilterSuffix(const vector& suffixs, const struct dirent& filename) +static bool FilterSuffix(const vector &suffixs, const struct dirent &filename) { if (filename.d_type == DT_DIR) { return true; @@ -167,7 +166,7 @@ static bool FilterSuffix(const vector& suffixs, const struct dirent& fil return false; } -static bool FilterDisplayname(const vector& displaynames, const struct dirent& filename) +static bool FilterDisplayname(const vector &displaynames, const struct dirent &filename) { for (const auto &iter : displaynames) { int ret = fnmatch(iter.c_str(), filename.d_name, FNM_PATHNAME | FNM_PERIOD); @@ -178,7 +177,7 @@ static bool FilterDisplayname(const vector& displaynames, const struct d return false; } -static bool FilterFilesizeOver(const int64_t fFileSizeOver, const struct dirent& filename) +static bool FilterFilesizeOver(const int64_t fFileSizeOver, const struct dirent &filename) { struct stat info; string stPath = (g_optionArgs.path + '/' + string(filename.d_name)); @@ -193,7 +192,8 @@ static bool FilterFilesizeOver(const int64_t fFileSizeOver, const struct dirent& return true; } -static bool FilterLastModifyTime(const double lastModifiedAfter, const struct dirent& filename) + +static bool FilterLastModifyTime(const double lastModifiedAfter, const struct dirent &filename) { struct stat info; string stPath = g_optionArgs.path + '/' + string(filename.d_name); @@ -202,7 +202,7 @@ static bool FilterLastModifyTime(const double lastModifiedAfter, const struct di HILOGE("Failed to stat file."); return false; } - if (lastModifiedAfter > time(&info.st_mtime)) { + if (lastModifiedAfter > static_cast(info.st_mtime)) { return false; } return true; @@ -244,59 +244,71 @@ static int32_t FilterFunc(const struct dirent *filename) return FILTER_DISMATCH; } -static vector FilterFileRes(const string &path) +static void Deleter(struct NameListArg *arg) { - struct dirent** namelist; - int num = scandir(path.c_str(), &(namelist), FilterFunc, alphasort); - vector dirents; - for (int i = 0; i < num; i++) { - struct dirent tmpDirent; - if (EOK == memcpy_s(&tmpDirent, sizeof(dirent), namelist[i], namelist[i]->d_reclen)) { - dirents.emplace_back(tmpDirent); - } - free(namelist[i]); + for (int i = 0; i < arg->direntNum; i++) { + free((arg->namelist)[i]); + (arg->namelist)[i] = nullptr; } - free(namelist); - return dirents; + free(arg->namelist); } -static void RecursiveFunc(const string &path, vector &dirents) +static int FilterFileRes(const string &path, vector &dirents) { - struct dirent** namelist; - int num = scandir(path.c_str(), &(namelist), FilterFunc, alphasort); + unique_ptr pNameList = { new (nothrow) struct NameListArg, Deleter }; + if (!pNameList) { + HILOGE("Failed to request heap memory."); + return ENOMEM; + } + int num = scandir(path.c_str(), &(pNameList->namelist), FilterFunc, alphasort); + if (num < 0) { + HILOGE("Failed to scan dir"); + return errno; + } + pNameList->direntNum = num; for (int i = 0; i < num; i++) { - if ((*namelist[i]).d_type == DT_REG) { - struct dirent tmpDirent; - if (EOK == memcpy_s(&tmpDirent, sizeof(dirent), namelist[i], namelist[i]->d_reclen)) { - dirents.emplace_back(tmpDirent); - } - } else if ((*(namelist)[i]).d_type == DT_DIR) { - string pathTemp = g_optionArgs.path; - g_optionArgs.path += '/' + string((*namelist[i]).d_name); - RecursiveFunc(g_optionArgs.path, dirents); - g_optionArgs.path = pathTemp; - } - free(namelist[i]); + dirents.emplace_back(pNameList->namelist[i]->d_name); } - free(namelist); + return ERRNO_NOERR; } -static napi_value DoListFileVector2NV(napi_env env, vector &dirents) +static int RecursiveFunc(const string &path, vector &dirents) { - vector strs; - for (size_t i = 0; i < dirents.size(); i++) { - strs.emplace_back(dirents[i].d_name); + unique_ptr pNameList = { new (nothrow) struct NameListArg, Deleter }; + if (!pNameList) { + HILOGE("Failed to request heap memory."); + return ENOMEM; + } + int num = scandir(path.c_str(), &(pNameList->namelist), FilterFunc, alphasort); + if (num < 0) { + HILOGE("Failed to scan dir"); + return errno; } - return NVal::CreateArrayString(env, strs).val_; + pNameList->direntNum = num; + for (int i = 0; i < num; i++) { + if ((*(pNameList->namelist[i])).d_type == DT_REG) { + dirents.emplace_back(path + '/' + pNameList->namelist[i]->d_name); + } else if ((*(pNameList->namelist[i])).d_type == DT_DIR) { + string pathTemp = g_optionArgs.path; + g_optionArgs.path += '/' + string((*(pNameList->namelist[i])).d_name); + int ret = RecursiveFunc(g_optionArgs.path, dirents); + if (ret != ERRNO_NOERR) { + return ret; + } + g_optionArgs.path = pathTemp; + } + } + return ERRNO_NOERR; } -static NVal DoListFileCompile(napi_env env, NError err, shared_ptr arg) +static napi_value DoListFileVector2NV(napi_env env, const string &path, vector &dirents, bool recursion) { - if (err) { - return { env, err.GetNapiErr(env) }; - } else { - return { env, DoListFileVector2NV(env, arg->dirents) }; + if (recursion) { + for (size_t i = 0; i < dirents.size(); i++) { + dirents[i] = dirents[i].substr(path.length()); + } } + return NVal::CreateArrayString(env, dirents).val_; } napi_value ListFile::Sync(napi_env env, napi_callback_info info) @@ -317,14 +329,16 @@ napi_value ListFile::Sync(napi_env env, napi_callback_info info) NError(EINVAL).ThrowErr(env); return nullptr; } - vector direntsRes; - if (g_optionArgs.recursion) { - RecursiveFunc(path.get(), direntsRes); - } else { - direntsRes = FilterFileRes(path.get()); + vector direntsRes; + int ret = 0; + ret = g_optionArgs.recursion ? RecursiveFunc(path.get(), direntsRes) : FilterFileRes(path.get(), direntsRes); + if (ret) { + NError(ret).ThrowErr(env); + return nullptr; } + auto res = DoListFileVector2NV(env, string(path.get()), direntsRes, g_optionArgs.recursion); g_optionArgs.Clear(); - return DoListFileVector2NV(env, direntsRes); + return res; } napi_value ListFile::Async(napi_env env, napi_callback_info info) @@ -358,20 +372,18 @@ napi_value ListFile::Async(napi_env env, napi_callback_info info) auto cbExec = [arg, optionArgsTmp]() -> NError { g_optionArgs = optionArgsTmp; - if (g_optionArgs.recursion) { - RecursiveFunc(g_optionArgs.path, arg->dirents); - } else { - arg->dirents = FilterFileRes(g_optionArgs.path); - } + int ret = 0; + ret = g_optionArgs.recursion ? RecursiveFunc(g_optionArgs.path, arg->dirents) : + FilterFileRes(g_optionArgs.path, arg->dirents); g_optionArgs.Clear(); - return NError(ERRNO_NOERR); + return ret ? NError(ret) : NError(ERRNO_NOERR); }; - auto cbCompl = [arg](napi_env env, NError err) -> NVal { + auto cbCompl = [arg, optionArgsTmp, path = string(path.get())](napi_env env, NError err) -> NVal { if (err) { return { env, err.GetNapiErr(env) }; } - return DoListFileCompile(env, err, arg); + return { env, DoListFileVector2NV(env, path, arg->dirents, optionArgsTmp.recursion) }; }; NVal thisVar(env, funcArg.GetThisVar()); diff --git a/interfaces/kits/js/src/mod_fs/properties/listfile.h b/interfaces/kits/js/src/mod_fs/properties/listfile.h index 08316dae5..4378be064 100644 --- a/interfaces/kits/js/src/mod_fs/properties/listfile.h +++ b/interfaces/kits/js/src/mod_fs/properties/listfile.h @@ -31,12 +31,12 @@ public: class ListFileArgs { public: - std::vector dirents; - explicit ListFileArgs() - { - dirents = std::vector(); - } - ~ListFileArgs() = default; + std::vector dirents; +}; + +struct NameListArg { + struct dirent** namelist = { nullptr }; + int direntNum = 0; }; struct OptionArgs { diff --git a/utils/filemgmt_libn/src/n_val.cpp b/utils/filemgmt_libn/src/n_val.cpp index 0c87c93bd..b6fd74140 100644 --- a/utils/filemgmt_libn/src/n_val.cpp +++ b/utils/filemgmt_libn/src/n_val.cpp @@ -142,7 +142,7 @@ tuple NVal::ToUint64() const tuple, uint32_t> NVal::ToStringArray() { napi_status status; - uint32_t size; + uint32_t size = 0; status = napi_get_array_length(env_, val_, &size); vector stringArray; napi_value result; -- Gitee