From 0db41e3813c2493f49ffad38b98720597f5d6805 Mon Sep 17 00:00:00 2001 From: fengjq Date: Sat, 2 Aug 2025 19:58:04 +0800 Subject: [PATCH] Clean code check Signed-off-by: fengjq --- .../src/sync_rule/battery_status.cpp | 13 +-- .../src/cloud_sync_common.cpp | 33 ++++++-- .../src/cloud_sync_manager_impl.cpp | 5 +- .../js/ani/ani_helper/src/error_handler.cpp | 3 +- .../ets/@ohos.file.cloudSync.ets | 18 ++--- .../include/register_callback_manager_ani.h | 6 +- .../src/cloud_sync_callback_ani.cpp | 32 +++----- .../src/download_progress_ani.cpp | 52 +++++++++--- .../src/register_callback_manager_ani.cpp | 1 + .../src/cloud_sync_manager_ani.cpp | 4 +- .../cloudfilesync/cloud_file_cache_napi.cpp | 1 + .../js/cloudfilesync/cloud_file_cache_napi.h | 1 + .../kits/js/cloudfilesync/cloud_sync_napi.cpp | 4 +- .../register_callback_manager_napi.h | 4 +- .../fuse_manager/cloud_daemon_statistic.h | 2 + .../src/cloud_disk/file_operations_cloud.cpp | 13 ++- .../src/cloud_disk/io_message_listener.cpp | 1 + .../fuse_manager/cloud_daemon_statistic.cpp | 37 ++++++++- .../src/fuse_manager/fuse_manager.cpp | 17 +++- .../src/ipc/cloud_sync_service.cpp | 2 +- .../cloud_disk/file_range_lock_test.cpp | 24 +++++- .../cloudsync_impl/cloud_sync_common_test.cpp | 80 +++++++++++++++++++ .../fuse_manager_static_test.cpp | 31 +++++++ utils/dentry/src/file_utils.cpp | 4 + 24 files changed, 317 insertions(+), 71 deletions(-) diff --git a/frameworks/native/cloud_file_kit_inner/src/sync_rule/battery_status.cpp b/frameworks/native/cloud_file_kit_inner/src/sync_rule/battery_status.cpp index 150219869..9a16a17c5 100644 --- a/frameworks/native/cloud_file_kit_inner/src/sync_rule/battery_status.cpp +++ b/frameworks/native/cloud_file_kit_inner/src/sync_rule/battery_status.cpp @@ -22,7 +22,7 @@ constexpr int32_t DEFAULT_BATTERY_CAPCITY = 100; void BatteryStatus::SetChargingStatus(bool status) { - isCharging_ = status; + isCharging_.store(status); } void BatteryStatus::GetInitChargingStatus() @@ -30,8 +30,9 @@ void BatteryStatus::GetInitChargingStatus() #ifdef SUPPORT_POWER auto &batterySrvClient = PowerMgr::BatterySrvClient::GetInstance(); auto pluggedType = batterySrvClient.GetPluggedType(); - isCharging_ = pluggedType != PowerMgr::BatteryPluggedType::PLUGGED_TYPE_NONE && - pluggedType != PowerMgr::BatteryPluggedType::PLUGGED_TYPE_BUTT; + auto ret = pluggedType != PowerMgr::BatteryPluggedType::PLUGGED_TYPE_NONE && + pluggedType != PowerMgr::BatteryPluggedType::PLUGGED_TYPE_BUTT; + isCharging_.store(ret); LOGI("pluggedType: %{public}d, isCharging: %{public}d", pluggedType, isCharging_.load()); #endif } @@ -48,7 +49,7 @@ int32_t BatteryStatus::GetCapacity() bool BatteryStatus::IsAllowUpload(bool forceFlag) { - if (isCharging_) { + if (isCharging_.load()) { return true; } @@ -73,7 +74,7 @@ bool BatteryStatus::IsAllowUpload(bool forceFlag) bool BatteryStatus::IsBatteryCapcityOkay() { - if (isCharging_) { + if (isCharging_.load()) { return true; } @@ -94,6 +95,6 @@ BatteryStatus::CapacityLevel BatteryStatus::GetCapacityLevel() bool BatteryStatus::IsCharging() { - return isCharging_; + return isCharging_.load(); } } // namespace OHOS::FileManagement::CloudSync \ No newline at end of file diff --git a/frameworks/native/cloudsync_kit_inner/src/cloud_sync_common.cpp b/frameworks/native/cloudsync_kit_inner/src/cloud_sync_common.cpp index 275ec97f5..f7891d221 100644 --- a/frameworks/native/cloudsync_kit_inner/src/cloud_sync_common.cpp +++ b/frameworks/native/cloudsync_kit_inner/src/cloud_sync_common.cpp @@ -453,11 +453,19 @@ bool DowngradeProgress::ReadFromParcel(Parcel &parcel) LOGE("failed to read download state"); return false; } + if (temp < 0 || temp > static_cast(State::STOPPED)) { + LOGE("invalid state value: %{public}d", temp); + return false; + } state = static_cast(temp); if (!parcel.ReadInt32(temp)) { LOGE("failed to read stopReason"); return false; } + if (temp < 0 || temp > static_cast(StopReason::OTHER_REASON)) { + LOGE("invalid stopReason value: %{public}d", temp); + return false; + } stopReason = static_cast(temp); if (!parcel.ReadInt64(downloadedSize)) { LOGE("failed to read downloadedSize"); @@ -611,11 +619,26 @@ DentryFileInfoObj *DentryFileInfoObj::Unmarshalling(Parcel &parcel) bool AssetInfoObj::ReadFromParcel(Parcel &parcel) { - parcel.ReadString(uri); - parcel.ReadString(recordType); - parcel.ReadString(recordId); - parcel.ReadString(fieldKey); - parcel.ReadString(assetName); + if (!parcel.ReadString(uri)) { + LOGE("failed to read uri"); + return false; + } + if (!parcel.ReadString(recordType)) { + LOGE("failed to read recordType"); + return false; + } + if (!parcel.ReadString(recordId)) { + LOGE("failed to read recordId"); + return false; + } + if (!parcel.ReadString(fieldKey)) { + LOGE("failed to read fieldKey"); + return false; + } + if (!parcel.ReadString(assetName)) { + LOGE("failed to read assetName"); + return false; + } return true; } diff --git a/frameworks/native/cloudsync_kit_inner/src/cloud_sync_manager_impl.cpp b/frameworks/native/cloudsync_kit_inner/src/cloud_sync_manager_impl.cpp index 3d9545568..e97694cdd 100644 --- a/frameworks/native/cloudsync_kit_inner/src/cloud_sync_manager_impl.cpp +++ b/frameworks/native/cloudsync_kit_inner/src/cloud_sync_manager_impl.cpp @@ -218,7 +218,10 @@ int32_t CloudSyncManagerImpl::StartSync(bool forceFlag, const std::shared_ptr lock(callbackMutex_); + callback_ = callback; + } SubscribeListener(); SetDeathRecipient(CloudSyncServiceProxy->AsObject()); } diff --git a/interfaces/kits/js/ani/ani_helper/src/error_handler.cpp b/interfaces/kits/js/ani/ani_helper/src/error_handler.cpp index 991aeae5b..6d28cc339 100644 --- a/interfaces/kits/js/ani/ani_helper/src/error_handler.cpp +++ b/interfaces/kits/js/ani/ani_helper/src/error_handler.cpp @@ -16,10 +16,11 @@ #include "error_handler.h" namespace OHOS::FileManagement::CloudSync { +const std::string BUSINESS_ERROR_CLASS = "@ohos.base.BusinessError"; ani_status ErrorHandler::Throw(ani_env *env, int32_t code, const std::string &errMsg) { - Type clsName = Builder::BuildClass("@ohos.base.BusinessError"); + Type clsName = Builder::BuildClass(BUSINESS_ERROR_CLASS.c_str()); ani_class cls; ani_status ret = env->FindClass(clsName.Descriptor().c_str(), &cls); if (ret != ANI_OK) { diff --git a/interfaces/kits/js/ani/file_cloud_sync/ets/@ohos.file.cloudSync.ets b/interfaces/kits/js/ani/file_cloud_sync/ets/@ohos.file.cloudSync.ets index 0755db342..7379fb7f2 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/ets/@ohos.file.cloudSync.ets +++ b/interfaces/kits/js/ani/file_cloud_sync/ets/@ohos.file.cloudSync.ets @@ -383,9 +383,7 @@ export default namespace cloudSync { start(callback: AsyncCallback): void { let promise = taskpool.execute((): int => this.StartInner()); promise.then((): void => { - let e = new BusinessError(); - e.code = 0; - callback(e, undefined); + callback(null, undefined); }, (e: BusinessError): void => { callback(e, undefined); }); @@ -429,12 +427,9 @@ export default namespace cloudSync { getLastSyncTime(callback: AsyncCallback): void { let promise = taskpool.execute((): number => this.GallerySyncGetLastSyncTime()); promise.then((ret: number): void => { - let e = new BusinessError(); - e.code = 0; - callback(e, ret); + callback(null, ret); }, (e: BusinessError): void => { - let num: number = 0; - callback(e, num); + callback(e, undefined); }); } @@ -670,12 +665,9 @@ export default namespace cloudSync { let res: Array = re.map((result: int) => { return result as FileSyncState; }); - let e = new BusinessError(); - e.code = 0; - callback(e, res); + callback(null, res); }).catch((e: BusinessError): void => { - let res: Array = new Array(); - callback(e, res); + callback(e, undefined); }); } diff --git a/interfaces/kits/js/ani/file_cloud_sync/include/register_callback_manager_ani.h b/interfaces/kits/js/ani/file_cloud_sync/include/register_callback_manager_ani.h index 109db2704..681564395 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/include/register_callback_manager_ani.h +++ b/interfaces/kits/js/ani/file_cloud_sync/include/register_callback_manager_ani.h @@ -25,15 +25,17 @@ namespace OHOS::FileManagement::CloudSync { class RegisterCallbackManagerAni { public: void InitVm(ani_env *env); - bool IsExisted(ani_env *env, ani_ref ref); ani_status RegisterCallback(ani_env *env, ani_object callback); ani_status UnregisterCallback(ani_env *env, ani_object callback); - void OnJsCallback(ani_env *env, ani_object value, uint32_t argc); ani_env *GetEnv(); void DetachEnv(); protected: + bool IsExisted(ani_env *env, ani_ref ref); + +protected: + std::mutex vmMtx_; ani_vm *vm_{nullptr}; std::recursive_mutex callbackMtx_; std::atomic validRefNum_{0}; diff --git a/interfaces/kits/js/ani/file_cloud_sync/src/cloud_sync_callback_ani.cpp b/interfaces/kits/js/ani/file_cloud_sync/src/cloud_sync_callback_ani.cpp index ef6613c15..bfa4ab405 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/src/cloud_sync_callback_ani.cpp +++ b/interfaces/kits/js/ani/file_cloud_sync/src/cloud_sync_callback_ani.cpp @@ -347,43 +347,37 @@ void ChangeListenerAni::OnChange(CloudChangeListener &listener, const ani_ref cb LOGI("ChangeListenerAni OnChange"); ani_env *tmpEnv = env_; ani_size nr_refs = ANI_SCOPE_SIZE; - ani_status ret = tmpEnv->CreateLocalScope(nr_refs); - if (ret != ANI_OK) { - LOGE("crete local scope failed. ret = %{public}d", ret); - return; - } CloudChangeListener tmpListener = listener; if (tmpListener.changeInfo.uris_.empty()) { return; } - ani_namespace ns {}; - Namespace nsSign = Builder::BuildNamespace("@ohos.file.cloudSync.cloudSync"); - ret = tmpEnv->FindNamespace(nsSign.Descriptor().c_str(), &ns); + ani_status ret = tmpEnv->CreateLocalScope(nr_refs); if (ret != ANI_OK) { - LOGE("find namespace failed. ret = %{public}d", ret); + LOGE("crete local scope failed. ret = %{public}d", ret); return; } - Type clsName = Builder::BuildClass("ChangeDataInner"); ani_class cls; - ret = tmpEnv->Namespace_FindClass(ns, clsName.Descriptor().c_str(), &cls); - if (ret != ANI_OK) { - LOGE("find class failed. ret = %{public}d", ret); + std::string classDesc = + Builder::BuildClass("@ohos.file.cloudSync.cloudSync.ChangeDataInner").Descriptor(); + if ((ret = tmpEnv->FindClass(classDesc.c_str(), &cls)) != ANI_OK) { + LOGE("Cannot find class %{private}s, err: %{public}d", classDesc.c_str(), ret); + tmpEnv->DestroyLocalScope(); return; } ani_object changeData; - ret = GetChangeDataObject(tmpEnv, tmpListener, cls, changeData); + if ((ret = GetChangeDataObject(tmpEnv, tmpListener, cls, changeData)) != ANI_OK) { + LOGE("Cannot changeData object, ret = %{public}d", ret); + tmpEnv->DestroyLocalScope(); + return; + } ani_ref ref_; ani_fn_object etsCb = reinterpret_cast(cbRef); std::vector vec = { changeData }; ret = tmpEnv->FunctionalObject_Call(etsCb, 1, vec.data(), &ref_); if (ret != ANI_OK) { LOGE("ani call function failed. ret = %{public}d", ret); - return; - } - ret = tmpEnv->DestroyLocalScope(); - if (ret != ANI_OK) { - LOGE("failed to DestroyLocalScope. ret = %{public}d", ret); } + tmpEnv->DestroyLocalScope(); }; if (!ANIUtils::SendEventToMainThread(task)) { LOGE("failed to send event"); diff --git a/interfaces/kits/js/ani/file_cloud_sync/src/download_progress_ani.cpp b/interfaces/kits/js/ani/file_cloud_sync/src/download_progress_ani.cpp index be5473add..fd37c95dc 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/src/download_progress_ani.cpp +++ b/interfaces/kits/js/ani/file_cloud_sync/src/download_progress_ani.cpp @@ -35,6 +35,42 @@ void SingleProgressAni::Update(const DownloadProgressObj &progress) needClean_ = (progress.state != DownloadProgressObj::RUNNING); } +static ani_enum_item GetStateEnum(ani_env *env, int32_t state) +{ + ani_enum stateEnum; + Type stateSign = Builder::BuildEnum("@ohos.file.cloudSync.cloudSync.State"); + ani_status ret = env->FindEnum(stateSign.Descriptor().c_str(), &stateEnum); + if (ret != ANI_OK) { + LOGE("find state enum failed. ret = %{public}d", static_cast(ret)); + return nullptr; + } + ani_enum_item stateEnumItem; + ret = env->Enum_GetEnumItemByIndex(stateEnum, state, &stateEnumItem); + if (ret != ANI_OK) { + LOGE("get state enum item failed. ret = %{public}d", static_cast(ret)); + return nullptr; + } + return stateEnumItem; +} + +static ani_enum_item GetErrorTypeEnum(ani_env *env, int32_t errorType) +{ + ani_enum downloadErrorEnum; + Type errorSign = Builder::BuildEnum("@ohos.file.cloudSync.cloudSync.DownloadErrorType"); + ani_status ret = env->FindEnum(errorSign.Descriptor().c_str(), &downloadErrorEnum); + if (ret != ANI_OK) { + LOGE("find download error enum failed. ret = %{public}d", static_cast(ret)); + return nullptr; + } + ani_enum_item downloadErrorEnumItem; + ret = env->Enum_GetEnumItemByIndex(downloadErrorEnum, errorType, &downloadErrorEnumItem); + if (ret != ANI_OK) { + LOGE("get download error enum item failed. ret = %{public}d", static_cast(ret)); + return nullptr; + } + return downloadErrorEnumItem; +} + ani_object SingleProgressAni::ConvertToObject(ani_env *env) { ani_class cls; @@ -63,17 +99,11 @@ ani_object SingleProgressAni::ConvertToObject(ani_env *env) return nullptr; } - ani_enum stateEnum; - Type stateSign = Builder::BuildEnum("@ohos.file.cloudSync.cloudSync.State"); - env->FindEnum(stateSign.Descriptor().c_str(), &stateEnum); - ani_enum downloadErrorEnum; - Type errorSign = Builder::BuildEnum("@ohos.file.cloudSync.cloudSync.DownloadErrorType"); - env->FindEnum(errorSign.Descriptor().c_str(), &downloadErrorEnum); - - ani_enum_item stateEnumItem; - ani_enum_item downloadErrorEnumItem; - env->Enum_GetEnumItemByIndex(downloadErrorEnum, errorType_, &downloadErrorEnumItem); - env->Enum_GetEnumItemByIndex(stateEnum, state_, &stateEnumItem); + ani_enum_item stateEnumItem = GetStateEnum(env, state_); + ani_enum_item downloadErrorEnumItem = GetErrorTypeEnum(env, errorType_); + if (stateEnumItem == nullptr || downloadErrorEnumItem == nullptr) { + return nullptr; + } ani_object pg; ret = env->Object_New(cls, ctor, &pg, static_cast(taskId_), stateEnumItem, static_cast(downloadedSize_), static_cast(totalSize_), uri, diff --git a/interfaces/kits/js/ani/file_cloud_sync/src/register_callback_manager_ani.cpp b/interfaces/kits/js/ani/file_cloud_sync/src/register_callback_manager_ani.cpp index f0f0c68dd..430197685 100644 --- a/interfaces/kits/js/ani/file_cloud_sync/src/register_callback_manager_ani.cpp +++ b/interfaces/kits/js/ani/file_cloud_sync/src/register_callback_manager_ani.cpp @@ -24,6 +24,7 @@ using namespace std; // JS thread invokes native function void RegisterCallbackManagerAni::InitVm(ani_env *env) { + std::lock_guard lock(vmMtx_); if (vm_ == nullptr) { env->GetVM(&vm_); } diff --git a/interfaces/kits/js/ani/file_cloud_sync_manager/src/cloud_sync_manager_ani.cpp b/interfaces/kits/js/ani/file_cloud_sync_manager/src/cloud_sync_manager_ani.cpp index 22367938c..471ef5607 100644 --- a/interfaces/kits/js/ani/file_cloud_sync_manager/src/cloud_sync_manager_ani.cpp +++ b/interfaces/kits/js/ani/file_cloud_sync_manager/src/cloud_sync_manager_ani.cpp @@ -131,7 +131,7 @@ void CloudSyncManagerAni::EnableCloud(ani_env *env, ani_class clazz, ani_string std::string accoutIdStr; ani_status ret = ANIUtils::AniString2String(env, accoutId, accoutIdStr); if (ret != ANI_OK) { - ErrorHandler::Throw(env, E_PERMISSION); + ErrorHandler::Throw(env, E_PARAMS); return; } @@ -139,7 +139,7 @@ void CloudSyncManagerAni::EnableCloud(ani_env *env, ani_class clazz, ani_string Type clsName = Builder::BuildClass("escompat.Record"); ret = env->FindClass(clsName.Descriptor().c_str(), &recordCls); if (ret != ANI_OK) { - ErrorHandler::Throw(env, E_PERMISSION); + ErrorHandler::Throw(env, E_PARAMS); return; } diff --git a/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.cpp b/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.cpp index 4dcdafeaa..74f218072 100644 --- a/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.cpp +++ b/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.cpp @@ -216,6 +216,7 @@ static std::shared_ptr GetCallbackImpl(napi_env } std::shared_ptr callbackImpl = nullptr; + std::lock_guard lock(fileCacheEntity->registerMtx); auto iter = fileCacheEntity->registerMap.find(eventType); if (iter == fileCacheEntity->registerMap.end() || iter->second == nullptr) { if (isInit) { diff --git a/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.h b/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.h index 847a0a66a..1c28eee27 100644 --- a/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.h +++ b/interfaces/kits/js/cloudfilesync/cloud_file_cache_napi.h @@ -59,6 +59,7 @@ public: }; struct FileCacheEntity { + std::mutex registerMtx; std::unordered_map> registerMap; }; } // namespace OHOS::FileManagement::CloudSync diff --git a/interfaces/kits/js/cloudfilesync/cloud_sync_napi.cpp b/interfaces/kits/js/cloudfilesync/cloud_sync_napi.cpp index c92c1db48..981945db7 100644 --- a/interfaces/kits/js/cloudfilesync/cloud_sync_napi.cpp +++ b/interfaces/kits/js/cloudfilesync/cloud_sync_napi.cpp @@ -721,11 +721,11 @@ int32_t CloudSyncNapi::HandOptimizeStorageParams(napi_env env, napi_callback_inf int64_t totalSize = 0; int32_t agingDays = 0; tie(succ, totalSize) = argv.GetProp("totalSize").ToInt64(); - if (!succ) { + if (!succ || totalSize < 0) { return ERR_BAD_VALUE; } tie(succ, agingDays) = argv.GetProp("agingDays").ToInt32(); - if (!succ) { + if (!succ || agingDays < 0) { return ERR_BAD_VALUE; } diff --git a/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.h b/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.h index 1c1df12e0..93146a92d 100644 --- a/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.h +++ b/interfaces/kits/js/cloudfilesync/register_callback_manager_napi.h @@ -26,11 +26,13 @@ namespace OHOS::FileManagement::CloudSync { class RegisterCallbackManagerNapi { public: explicit RegisterCallbackManagerNapi(napi_env env) : env_(env) {} - bool IsExisted(napi_value callback); napi_status RegisterCallback(napi_value callback); napi_status UnregisterCallback(napi_value callback); void OnJsCallback(napi_value *value, uint32_t argc); +protected: + bool IsExisted(napi_value callback); + protected: napi_env env_; std::recursive_mutex callbackMtx_; diff --git a/services/cloudfiledaemon/include/fuse_manager/cloud_daemon_statistic.h b/services/cloudfiledaemon/include/fuse_manager/cloud_daemon_statistic.h index 4ca56fdeb..11a2b802a 100644 --- a/services/cloudfiledaemon/include/fuse_manager/cloud_daemon_statistic.h +++ b/services/cloudfiledaemon/include/fuse_manager/cloud_daemon_statistic.h @@ -16,6 +16,7 @@ #ifndef CLOUD_DAEMON_STATISTIC_H #define CLOUD_DAEMON_STATISTIC_H +#include #include #include @@ -84,6 +85,7 @@ private: CloudDaemonStatistic() = default; ~CloudDaemonStatistic() = default; void AddFileData(CloudDaemonStatisticInfo &info); + void AddFileDataPost(CloudDaemonStatisticInfo &info, std::ifstream &statDataFile); void ClearStat(); void OutputToFile(); int32_t CheckFileStat(); diff --git a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp index 7440e3851..18d01f387 100644 --- a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp +++ b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp @@ -583,7 +583,14 @@ static void HandleCloudReopen(struct fuse_file_info *fi, struct CloudDiskFuseDat if (metaBase.fileType != FILE_TYPE_CONTENT) { string path = CloudFileUtils::GetLocalFilePath(inoPtr->cloudId, inoPtr->bundleName, data->userId); unsigned int flags = GetFileOpenFlags(fi->flags); - int32_t fd = open(path.c_str(), flags); + unique_ptr absPath = make_unique(PATH_MAX + 1); + char *resPath = realpath(path.c_str(), absPath.get()); + if (resPath == nullptr) { + LOGE("realpath failed, path: %{public}s, errno: %{public}d", GetAnonyString(path).c_str(), errno); + fuse_reply_err(req, errno); + return; + } + int32_t fd = open(resPath, flags); if (fd < 0) { LOGE("failed to open local file, errno: %{public}d", errno); fuse_reply_err(req, errno); @@ -739,13 +746,13 @@ int32_t GenerateCloudId(int32_t userId, string &cloudId, const string &bundleNam auto dkDatabasePtr = GetDatabase(userId, bundleName); if (dkDatabasePtr == nullptr) { LOGE("Failed to get database"); - return ENOSYS; + return EINVAL; } vector ids; auto ret = dkDatabasePtr->GenerateIds(1, ids); if (ret != 0 || ids.size() == 0) { - return ENOSYS; + return EINVAL; } cloudId = ids[0]; return 0; diff --git a/services/cloudfiledaemon/src/cloud_disk/io_message_listener.cpp b/services/cloudfiledaemon/src/cloud_disk/io_message_listener.cpp index 8bf0b017a..c082496e0 100644 --- a/services/cloudfiledaemon/src/cloud_disk/io_message_listener.cpp +++ b/services/cloudfiledaemon/src/cloud_disk/io_message_listener.cpp @@ -166,6 +166,7 @@ void IoMessageManager::OnReceiveEvent(const AppExecFwk::AppStateData &appStateDa { if (appStateData.bundleName != DESK_BUNDLE_NAME) { if (appStateData.state == TYPE_FRONT) { + lock_guard lock(cvMute); lastestAppStateData = appStateData; if (!ioThread.joinable()) { isThreadRunning.store(true); diff --git a/services/cloudfiledaemon/src/fuse_manager/cloud_daemon_statistic.cpp b/services/cloudfiledaemon/src/fuse_manager/cloud_daemon_statistic.cpp index ad8cbf9bb..d389b9006 100644 --- a/services/cloudfiledaemon/src/fuse_manager/cloud_daemon_statistic.cpp +++ b/services/cloudfiledaemon/src/fuse_manager/cloud_daemon_statistic.cpp @@ -150,28 +150,61 @@ void CloudDaemonStatistic::AddFileData(CloudDaemonStatisticInfo &info) LOGI("file cloud_sync_read_file_stat not exist."); return; } - + for (uint32_t i = 0; i < OPEN_SIZE_MAX; i++) { statDataFile >> info.openSizeStat[i]; + if (statDataFile.fail()) { + LOGE("read openSizeStat_[%{public}u] failed.", i); + statDataFile.close(); + return; + } } for (uint32_t i = 0; i < FILE_TYPE_MAX; i++) { for (uint32_t j = 0; j < OPEN_TIME_MAX; j++) { statDataFile >> info.openTimeStat[i][j]; + if (statDataFile.fail()) { + LOGE("read openTimeStat_[%{public}u][%{public}u] failed.", i, j); + statDataFile.close(); + return; + } } } + + AddFileDataPost(info, statDataFile); + statDataFile.close(); +} + +void CloudDaemonStatistic::AddFileDataPost(CloudDaemonStatisticInfo &info, std::ifstream &statDataFile) +{ for (uint32_t i = 0; i < READ_SIZE_MAX; i++) { statDataFile >> info.readSizeStat[i]; + if (statDataFile.fail()) { + LOGE("read readSizeStat_[%{public}u] failed.", i); + statDataFile.close(); + return; + } } for (uint32_t i = 0; i < READ_SIZE_MAX; i++) { for (uint32_t j = 0; j < READ_TIME_MAX; j++) { statDataFile >> info.readTimeStat[i][j]; + if (statDataFile.fail()) { + LOGE("read readTimeStat_[%{public}u][%{public}u] failed.", i, j); + return; + } } } for (uint32_t i = 0; i < VIDEO_READ_INFO; i++) { statDataFile >> info.videoReadInfo[i]; + if (statDataFile.fail()) { + LOGE("read videoReadInfo_[%{public}u] failed.", i); + return; + } } statDataFile >> info.bundleName; - statDataFile.close(); + if (statDataFile.fail()) { + LOGE("read bundleName failed."); + } + return; } int32_t CloudDaemonStatistic::CheckFileStat() diff --git a/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp b/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp index cb3bc373f..7452d760e 100644 --- a/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp +++ b/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp @@ -288,6 +288,21 @@ static void EraseReadArgs(shared_ptr cInode, vector std::numeric_limits::max()) { + LOGE("Tgid value out of range: %{public}ld", pidLong); + return 0; + } + + return static_cast(pidLong); +} + static pid_t GetPidFromTid(pid_t tid) { pid_t tgid = 0; @@ -303,7 +318,7 @@ static pid_t GetPidFromTid(pid_t tid) size_t colonPos = line.find(':'); if (colonPos != std::string::npos) { std::string tgidStr = line.substr(colonPos + 1); - tgid = std::atoi(tgidStr.c_str()); + tgid = ConvertToPid(tgidStr); } break; } diff --git a/services/cloudsyncservice/src/ipc/cloud_sync_service.cpp b/services/cloudsyncservice/src/ipc/cloud_sync_service.cpp index 9d1b03df8..f18558e1f 100644 --- a/services/cloudsyncservice/src/ipc/cloud_sync_service.cpp +++ b/services/cloudsyncservice/src/ipc/cloud_sync_service.cpp @@ -622,7 +622,7 @@ int32_t CloudSyncService::CleanCacheInner(const std::string &uri) auto callerUserId = DfsuAccessTokenHelper::GetUserId(); int32_t ret = dataSyncManager_->CleanCache(bundleName, callerUserId, uri); LOGI("End CleanCacheInner"); - return E_OK; + return ret; } int32_t CloudSyncService::CleanFileCacheInner(const std::string &uri) diff --git a/test/unittests/cloud_disk/file_range_lock_test.cpp b/test/unittests/cloud_disk/file_range_lock_test.cpp index 7ff712d2c..23158c740 100644 --- a/test/unittests/cloud_disk/file_range_lock_test.cpp +++ b/test/unittests/cloud_disk/file_range_lock_test.cpp @@ -78,7 +78,7 @@ HWTEST_F(FileRangeLockTest, FilePosLockTest001, TestSize.Level1) GTEST_LOG_(INFO) << "FilePosLockTest001 End"; } -/**a +/** * @tc.name: FilePosLockTest002 * @tc.desc: Verify the FilePosLock function * @tc.type: FUNC @@ -99,4 +99,26 @@ HWTEST_F(FileRangeLockTest, FilePosLockTest002, TestSize.Level1) } GTEST_LOG_(INFO) << "FilePosLockTest002 End"; } + +/** + * @tc.name: FilePosLockTest003 + * @tc.desc: Verify the FilePosLock function + * @tc.type: FUNC + */ +HWTEST_F(FileRangeLockTest, FilePosLockTest003, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FilePosLockTest003 Start"; + try { + int fd = 0; + off_t offset = 0; + size_t size = 4096; + int type = -1; // invalid type + int ret = FileRangeLock::FilePosLock(fd, offset, size, type); + EXPECT_EQ(ret, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "FilePosLockTest003 ERROR"; + } + GTEST_LOG_(INFO) << "FilePosLockTest003 End"; +} } \ No newline at end of file diff --git a/test/unittests/cloudsync_api/cloudsync_impl/cloud_sync_common_test.cpp b/test/unittests/cloudsync_api/cloudsync_impl/cloud_sync_common_test.cpp index 021186557..1db012cfe 100644 --- a/test/unittests/cloudsync_api/cloudsync_impl/cloud_sync_common_test.cpp +++ b/test/unittests/cloudsync_api/cloudsync_impl/cloud_sync_common_test.cpp @@ -434,6 +434,45 @@ HWTEST_F(CloudSyncCommonTest, Marshalling009, TestSize.Level1) GTEST_LOG_(INFO) << "Marshalling009 End"; } +/* + * @tc.name: DowngradeProgress_Marshalling010 + * @tc.desc: Verify the DowngradeProgress_Marshalling function. + * @tc.type: FUNC + * @tc.require: I6H5MH + */ +HWTEST_F(CloudSyncCommonTest, DowngradeProgress_Marshalling010, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "DowngradeProgress_Marshalling010 Start"; + try { + DowngradeProgress progress; + Parcel parcel; + EXPECT_CALL(*parcel_, ReadInt32(_)).WillOnce(DoAll(SetArgReferee<0>(-1), Return(true))); + auto res = progress.ReadFromParcel(parcel); + EXPECT_TRUE(!res); + + EXPECT_CALL(*parcel_, ReadInt32(_)) + .WillOnce(DoAll(SetArgReferee<0>(static_cast(DowngradeProgress::STOPPED) + 1), Return(true))); + res = progress.ReadFromParcel(parcel); + EXPECT_TRUE(!res); + + EXPECT_CALL(*parcel_, ReadInt32(_)) + .WillOnce(DoAll(SetArgReferee<0>(static_cast(DowngradeProgress::STOPPED)), Return(true))) + .WillOnce(DoAll(SetArgReferee<0>(-1), Return(true))); + res = progress.ReadFromParcel(parcel); + EXPECT_TRUE(!res); + + EXPECT_CALL(*parcel_, ReadInt32(_)) + .WillOnce(DoAll(SetArgReferee<0>(static_cast(DowngradeProgress::STOPPED)), Return(true))) + .WillOnce(DoAll(SetArgReferee<0>(static_cast(DowngradeProgress::OTHER_REASON) + 1), Return(true))); + res = progress.ReadFromParcel(parcel); + EXPECT_TRUE(!res); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << " DowngradeProgress_Marshalling010 FAILED"; + } + GTEST_LOG_(INFO) << "DowngradeProgress_Marshalling010 End"; +} + /* * @tc.name: Marshalling008 * @tc.desc: Verify the Marshalling008 function. @@ -886,6 +925,47 @@ HWTEST_F(CloudSyncCommonTest, ReadFromParcel00, TestSize.Level1) GTEST_LOG_(INFO) << "ReadFromParcel00 End"; } +/* + * @tc.name: AssetInfoObj_ReadFromParcel002 + * @tc.desc: Verify the AssetInfoObj_ReadFromParcel function. + * @tc.type: FUNC + * @tc.require: I6H5MH + */ +HWTEST_F(CloudSyncCommonTest, AssetInfoObj_ReadFromParcel002, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "AssetInfoObj_ReadFromParcel002 Start"; + try { + AssetInfoObj assetInfo; + Parcel parcel; + + EXPECT_CALL(*parcel_, ReadString(_)).WillOnce(Return(false)); + auto res = assetInfo.ReadFromParcel(parcel); + EXPECT_TRUE(!res); + + EXPECT_CALL(*parcel_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(false)); + res = assetInfo.ReadFromParcel(parcel); + EXPECT_TRUE(!res); + + EXPECT_CALL(*parcel_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(false)); + res = assetInfo.ReadFromParcel(parcel); + EXPECT_TRUE(!res); + + EXPECT_CALL(*parcel_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(false)); + res = assetInfo.ReadFromParcel(parcel); + EXPECT_TRUE(!res); + + EXPECT_CALL(*parcel_, ReadString(_)).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)) + .WillOnce(Return(true)).WillOnce(Return(false)); + res = assetInfo.ReadFromParcel(parcel); + EXPECT_TRUE(!res); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << " AssetInfoObj_ReadFromParcel002 FAILED"; + } + GTEST_LOG_(INFO) << "AssetInfoObj_ReadFromParcel002 End"; +} + /* * @tc.name: ReadFromParcel100 * @tc.desc: Verify the ReadFromParcel function. diff --git a/test/unittests/services_daemon/fuse_manager_static_test.cpp b/test/unittests/services_daemon/fuse_manager_static_test.cpp index a7c718843..d751f8191 100644 --- a/test/unittests/services_daemon/fuse_manager_static_test.cpp +++ b/test/unittests/services_daemon/fuse_manager_static_test.cpp @@ -414,4 +414,35 @@ HWTEST_F(FuseManagerStaticTest, IsHdc002, TestSize.Level1) } GTEST_LOG_(INFO) << "IsHdc002 End"; } + +/** + * @tc.name: ConvertToPidTest001 + * @tc.desc: Verify the ConvertToPid function + * @tc.type: FUNC + */ +HWTEST_F(FuseManagerStaticTest, ConvertToPidTest001, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ConvertToPidTest001 Begin"; + try { + std::string pidStr = "12345"; + pid_t pid = ConvertToPid(pidStr); + EXPECT_EQ(pid, 12345); + + pidStr = ""; + pid = ConvertToPid(pidStr); + EXPECT_EQ(pid, 0); + + pidStr = "12345678901234567890"; + pid = ConvertToPid(pidStr); + EXPECT_EQ(pid, 0); + + pidStr = "-12345"; + pid = ConvertToPid(pidStr); + EXPECT_EQ(pid, 0); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ConvertToPidTest001 Error"; + } + GTEST_LOG_(INFO) << "ConvertToPidTest001 End"; +} } // namespace OHOS::FileManagement::CloudSync::Test \ No newline at end of file diff --git a/utils/dentry/src/file_utils.cpp b/utils/dentry/src/file_utils.cpp index c66cc4c51..1387fe262 100644 --- a/utils/dentry/src/file_utils.cpp +++ b/utils/dentry/src/file_utils.cpp @@ -82,6 +82,10 @@ int64_t FileUtils::WriteFile(int fd, const void *data, off_t offset, size_t size int FileRangeLock::FilePosLock(int fd, off_t offset, size_t size, int type) { + if (type != F_RDLCK && type != F_WRLCK && type != F_UNLCK) { + LOGE("invalid lock type: %{public}d", type); + return EINVAL; + } struct flock fl; fl.l_type = static_cast(type); fl.l_whence = SEEK_SET; -- Gitee