diff --git a/services/include/concurrent_task_controller.h b/services/include/concurrent_task_controller.h index 5cb2d59f117625194f721b8e0c1e9bda34d654c5..d81478869241e6e6641f4d8ea1891e49ab5c597f 100644 --- a/services/include/concurrent_task_controller.h +++ b/services/include/concurrent_task_controller.h @@ -52,18 +52,19 @@ private: int GetRequestType(std::string strRequstType); void DealSystemRequest(int requestType, const Json::Value& payload); void DealAppRequest(int requestType, const Json::Value& payload, pid_t uid); - void NewForeground(int uid, const Json::Value& payload); - void NewBackground(int uid); - void NewAppStart(int uid); - void AppKilled(int uid); + void NewForeground(int uid, int pid); + void NewBackground(int uid, int pid); + void NewAppStart(int uid, int pid); + void AppKilled(int uid, int pid); std::list::iterator GetRecordOfUid(int uid); void PrintInfo(); + bool ParsePayload(const Json::Value& payload, int& uid, int& pid); std::mutex appInfoLock_; std::list foregroundApp_ = {}; std::unordered_map msgType_ = {}; QosPolicy qosPolicy_; - std::vector authApps_; + std::map> authApps_; int renderServiceGrpId_ = -1; int rsTid_ = -1; bool rtgEnabled_ = false; diff --git a/services/src/concurrent_task_controller.cpp b/services/src/concurrent_task_controller.cpp index 75939ed08d19f719785d9c53bee3732952a90563..48eb64c5f549352a9a925e7167f9aa3c54843396 100644 --- a/services/src/concurrent_task_controller.cpp +++ b/services/src/concurrent_task_controller.cpp @@ -260,30 +260,40 @@ bool TaskController::CheckUid(pid_t uid) return true; } -void TaskController::DealSystemRequest(int requestType, const Json::Value& payload) +bool TaskController::ParsePayload(const Json::Value& payload, int& uid, int& pid) { - int appUid = 0; try { - appUid = stoi(payload["uid"].asString()); - } catch (...) { - CONCUR_LOGE("Unexpected uid format"); + uid = stoi(payload["uid"].asString()); + pid = stoi(payload["pid"].asString()); + } catch(...) { + CONCUR_LOGE("Unexpected uid or pid format"); + return false; } - if (appUid < 0) { - CONCUR_LOGE("appUid error:%d", appUid); + if (uid > 0 && pid > 0) { + return true; + } + return false; +} + +void TaskController::DealSystemRequest(int requestType, const Json::Value& payload) +{ + int uid = -1; + int pid = -1; + if (!ParsePayload(payload, uid, pid)) { return; } switch (requestType) { case MSG_FOREGROUND: - NewForeground(appUid, payload); + NewForeground(uid, pid); break; case MSG_BACKGROUND: - NewBackground(appUid); + NewBackground(uid, pid); break; case MSG_APP_START: - NewAppStart(appUid); + NewAppStart(uid, pid); break; case MSG_APP_KILLED: - AppKilled(appUid); + AppKilled(uid, pid); break; default: CONCUR_LOGE("Unknown system request"); @@ -327,20 +337,10 @@ std::list::iterator TaskController::GetRecordOfUid(int uid) return foregroundApp_.end(); } -void TaskController::NewForeground(int uid, const Json::Value& payload) +void TaskController::NewForeground(int uid, int pid) { - int uiTid = 0; - try { - uiTid = std::stoi(payload["pid"].asString()); - } catch (...) { - CONCUR_LOGE("Unexpected pid format uiTid is %{public}d", uiTid); - return; - } - if (uiTid < 0) { - CONCUR_LOGE("uiTid error: %{public}d", uiTid); - return; - } - auto it = find(authApps_.begin(), authApps_.end(), uid); + int uiTid = pid; + auto it = authApps_.find(uid); if (it == authApps_.end()) { CONCUR_LOGI("un-authed uid %{public}d", uid); return; @@ -380,9 +380,9 @@ void TaskController::NewForeground(int uid, const Json::Value& payload) } } -void TaskController::NewBackground(int uid) +void TaskController::NewBackground(int uid, int pid) { - auto it = find(authApps_.begin(), authApps_.end(), uid); + auto it = authApps_.find(uid); if (it == authApps_.end()) { CONCUR_LOGI("un-authed uid %{public}d", uid); return; @@ -404,7 +404,7 @@ void TaskController::NewBackground(int uid) } } -void TaskController::NewAppStart(int uid) +void TaskController::NewAppStart(int uid, int pid) { CONCUR_LOGI("uid %{public}d start.", uid); unsigned int uidParam = static_cast(uid); @@ -416,13 +416,34 @@ void TaskController::NewAppStart(int uid) CONCUR_LOGI("auth_enable %{public}d success", uid); } else { CONCUR_LOGE("auth_enable %{public}d fail with ret %{public}d", uid, ret); + return; + } + auto it = authApps_.find(uid); + if (it == authApps_.end()) { + authApps_.insert(pair>(uid, {pid})); + CONCUR_LOGD("uid %{public}d create, insert pid %{public}d", uid, pid); + } else { + auto iter = it->second.find(pid); + if (iter == it->second.end()) { + it->second.insert(pid); + CONCUR_LOGD("pid %{public}d insert uid %{public}d, size = %{public}d", + pid, uid, static_cast(it->second.size())); + } } - authApps_.push_back(uid); } -void TaskController::AppKilled(int uid) +void TaskController::AppKilled(int uid, int pid) { CONCUR_LOGI("uid %{public}d killed.", uid); + auto it = authApps_.find(uid); + if (it != authApps_.end()) { + it->second.erase(pid); + if (it->second.size() != 0) { + CONCUR_LOGD("uid %{public}d is still has %{public}d pid", uid, static_cast(it->second.size())); + return; + } + authApps_.erase(it); + } unsigned int uidParam = static_cast(uid); int ret = AuthDelete(uidParam); if (ret == 0) { @@ -437,12 +458,6 @@ void TaskController::AppKilled(int uid) break; } } - for (auto iter = authApps_.begin(); iter != authApps_.end(); iter++) { - if (*iter == uid) { - authApps_.erase(iter++); - break; - } - } } void TaskController::PrintInfo() diff --git a/test/fuzztest/concurrent_fuzzer/BUILD.gn b/test/fuzztest/concurrent_fuzzer/BUILD.gn index 7f025a65d5070acd138943caa01bb2a92a55ad41..ba299d596e35a6693ffceae9090b4ba3163902c6 100644 --- a/test/fuzztest/concurrent_fuzzer/BUILD.gn +++ b/test/fuzztest/concurrent_fuzzer/BUILD.gn @@ -15,12 +15,13 @@ import("//build/config/features.gni") import("//build/test.gni") ohos_fuzztest("ConcurrentFuzzTest") { - module_out_path = "qos_manager/concurrent_fuzz_test/" + module_out_path = "qos_manager/qos_manager/" fuzz_config_file = "../../../test/fuzztest/concurrent_fuzzer" include_dirs = [ "../../../include/", "../../../interfaces/inner_api/", "../../../frameworks/concurrent_task_client/include/", + "../../../services/include/", ] cflags = [ "-g", @@ -36,6 +37,7 @@ ohos_fuzztest("ConcurrentFuzzTest") { ] external_deps = [ "c_utils:utils", + "hilog:libhilog", "ipc:ipc_single", "samgr:samgr_proxy", ] diff --git a/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp b/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp index efa1e79439a1b530002c3c71bc17c2dcdd13480b..c5d113e0da7a2445b3d57c50cc36c5683b990174 100644 --- a/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp +++ b/test/fuzztest/concurrent_fuzzer/concurrent_fuzzer.cpp @@ -18,12 +18,32 @@ #include "concurrent_task_client.h" #undef private #include "concurrent_task_service_proxy.h" +#include "concurrent_task_service.h" #include "securec.h" #include "concurrent_fuzzer.h" using namespace OHOS::ConcurrentTask; namespace OHOS { +const uint8_t *g_baseFuzzData = nullptr; +size_t g_baseFuzzSize = 0; +size_t g_baseFuzzPos; + +template T GetData() +{ + T object{}; + size_t objectSize = sizeof(object); + if (g_baseFuzzData == nullptr || objectSize > g_baseFuzzSize - g_baseFuzzPos) { + return object; + } + ErrCode ret = memcpy_s(&object, objectSize, g_baseFuzzData + g_baseFuzzPos, objectSize); + if (ret != ERR_OK) { + return {}; + } + g_baseFuzzPos += objectSize; + return object; +} + bool FuzzConcurrentTaskTryConnect(const uint8_t* data, size_t size) { if (data == nullptr) { @@ -37,36 +57,49 @@ bool FuzzConcurrentTaskTryConnect(const uint8_t* data, size_t size) bool FuzzConcurrentTaskServiceReportData(const uint8_t* data, size_t size) { - if (data == nullptr) { - return false; - } - if (size < sizeof(int32_t)) { - return false; + g_baseFuzzData = data; + g_baseFuzzSize = size; + g_baseFuzzPos = 0; + if (size > sizeof(int) + sizeof(int)) { + MessageParcel data1; + Parcel parcel; + sptr iremoteobject = IRemoteObject::Unmarshalling(parcel); + int intdata = GetData(); + void *voiddata = &intdata; + size_t size1 = sizeof(int); + data1.WriteRemoteObject(iremoteobject); + data1.WriteRawData(voiddata, size1); + data1.ReadRawData(size1); + MessageParcel reply; + MessageOption option; + uint32_t code = static_cast(ConcurrentTaskInterfaceCode::REPORT_DATA); + ConcurrentTaskService s = ConcurrentTaskService(); + s.OnRemoteRequest(code, data1, reply, option); } - - std::string name((const char*) data, size); - uint32_t resType = static_cast(*data); - int64_t value = static_cast(*data); - std::unordered_map payload; - payload["name"] = name; - OHOS::ConcurrentTask::ConcurrentTaskClient::GetInstance().ReportData(resType, value, payload); return true; } bool FuzzConcurrentTaskServiceQueryInterval(const uint8_t* data, size_t size) { - if (data == nullptr) { - return false; + g_baseFuzzData = data; + g_baseFuzzSize = size; + g_baseFuzzPos = 0; + if (size > sizeof(int) + sizeof(int)) { + MessageParcel data1; + Parcel parcel; + sptr iremoteobject = IRemoteObject::Unmarshalling(parcel); + int intdata = GetData(); + void *voiddata = &intdata; + size_t size1 = sizeof(int); + data1.WriteRemoteObject(iremoteobject); + data1.WriteRawData(voiddata, size1); + data1.ReadRawData(size1); + MessageParcel reply; + MessageOption option; + uint32_t code = static_cast(ConcurrentTaskInterfaceCode::QUERY_INTERVAL); + ConcurrentTaskService s = ConcurrentTaskService(); + s.OnRemoteRequest(code, data1, reply, option); } - if (size < sizeof(int32_t)) { - return false; - } - - std::string name((const char*) data, size); - int queryItem = static_cast(*data); - IntervalReply rs; - rs.rtgId = -1; - OHOS::ConcurrentTask::ConcurrentTaskClient::GetInstance().QueryInterval(queryItem, rs); return true; } } // namespace OHOS diff --git a/test/unittest/phone/concurrent_task_controller_test.cpp b/test/unittest/phone/concurrent_task_controller_test.cpp index 46a85f642ab43dbf23829eaf740acb53a18698e4..c9621ac9d4fd71609c38a7313c87918a6c0133ed 100644 --- a/test/unittest/phone/concurrent_task_controller_test.cpp +++ b/test/unittest/phone/concurrent_task_controller_test.cpp @@ -200,25 +200,26 @@ HWTEST_F(ConcurrentTaskControllerTest, GetRequestTypeTest, TestSize.Level1) HWTEST_F(ConcurrentTaskControllerTest, NewForegroundTest, TestSize.Level1) { TaskController fore; - int uid = 0; - fore.NewForeground(uid, 0); - fore.NewBackground(uid); - fore.NewAppStart(uid); - fore.NewForeground(uid, 0); - fore.NewBackground(uid); - fore.AppKilled(uid); + int uid = getuid(); + int tid = gettid(); + fore.NewForeground(uid, tid); + fore.NewBackground(uid, tid); + fore.NewAppStart(uid, tid); + fore.NewForeground(uid, tid); + fore.NewBackground(uid, tid); + fore.AppKilled(uid, tid); uid = 574; fore.foregroundApp_.push_back(ForegroundAppRecord(574, 0)); fore.foregroundApp_.push_back(ForegroundAppRecord(1, 0)); fore.foregroundApp_.push_back(ForegroundAppRecord(3, 0)); auto iter = fore.foregroundApp_.begin(); EXPECT_EQ(iter->GetUid(), uid); - fore.NewForeground(uid, 0); - fore.NewBackground(uid); - fore.NewAppStart(uid); - fore.NewForeground(uid, 0); - fore.NewBackground(uid); - fore.AppKilled(uid); + fore.NewForeground(uid, tid); + fore.NewBackground(uid, tid); + fore.NewAppStart(uid, tid); + fore.NewForeground(uid, tid); + fore.NewBackground(uid, tid); + fore.AppKilled(uid, tid); } /**