1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "enableupgrademanager_fuzzer.h"
17
18 #include <cstddef>
19 #include <cstdint>
20 #define private public
21 #define protected public
22 #include "enable_upgrade_manager.h"
23 #include "full_ime_info_manager.h"
24 #undef private
25
26 using namespace OHOS::MiscServices;
27 namespace OHOS {
28
FuzzAgentStub(const uint8_t * data,size_t size)29 void FuzzAgentStub(const uint8_t *data, size_t size)
30 {
31 static std::vector<FullImeInfo> imeInfos;
32 static std::set<std::string> bundleNames;
33 static std::vector<std::string> bundleNamesVec;
34 static std::vector<ImeEnabledInfo> enabledInfos;
35 std::string fuzzedString(reinterpret_cast<const char *>(data), size);
36 auto fuzzInt32 = static_cast<int32_t>(size);
37 auto fuzzUint32 = static_cast<uint32_t>(size);
38 auto fuzzedBool = static_cast<bool>(data[0] % 2);
39 int32_t userId = fuzzInt32;
40 FullImeInfo imeInfo = { .isNewIme = fuzzedBool, .tokenId = fuzzUint32, .appId = fuzzedString,
41 .versionCode = fuzzUint32 };
42 imeInfos.push_back(imeInfo);
43 bundleNames.insert(fuzzedString);
44 bundleNamesVec.push_back(fuzzedString);
45 ImeEnabledInfo imeEnabeleInfo;
46 imeEnabeleInfo.bundleName = fuzzedString;
47 imeEnabeleInfo.extensionName = fuzzedString;
48 imeEnabeleInfo.enabledStatus = static_cast<EnabledStatus>(fuzzInt32);
49 imeEnabeleInfo.stateUpdateTime = fuzzedString;
50
51 ImeEnabledCfg newEnabledCfg;
52 newEnabledCfg.version = fuzzedString;
53 newEnabledCfg.enabledInfos = enabledInfos;
54 ImePersistInfo persisInfo;
55 persisInfo.userId = userId;
56 persisInfo.currentIme = fuzzedString;
57 persisInfo.currentSubName = fuzzedString;
58 persisInfo.tempScreenLockIme = fuzzedString;
59 persisInfo.isDefaultImeSet = fuzzedBool;
60 EnabledStatus initStatus = EnabledStatus::DISABLED;
61 EnableUpgradeManager::GetInstance().Upgrade(userId, imeInfos);
62 EnableUpgradeManager::GetInstance().GetEnabledTable(userId, bundleNames);
63 EnableUpgradeManager::GetInstance().GetFullExperienceTable(userId, bundleNames);
64 EnableUpgradeManager::GetInstance().MergeTwoTable(userId, enabledInfos);
65 EnableUpgradeManager::GetInstance().PaddedByBundleMgr(userId, imeInfos, enabledInfos);
66 EnableUpgradeManager::GetInstance().UpdateGlobalEnabledTable(userId, newEnabledCfg);
67 EnableUpgradeManager::GetInstance().GetGlobalTableUserId(fuzzedString);
68 EnableUpgradeManager::GetInstance().GenerateGlobalContent(userId, bundleNamesVec);
69 EnableUpgradeManager::GetInstance().GetImePersistCfg(userId, persisInfo);
70 EnableUpgradeManager::GetInstance().PaddedByImePersistCfg(userId, enabledInfos);
71 EnableUpgradeManager::GetInstance().ComputeEnabledStatus(fuzzedString, initStatus);
72 }
73
FuzzFullImeInfo(const uint8_t * data,size_t size)74 void FuzzFullImeInfo(const uint8_t *data, size_t size)
75 {
76 auto fuzzInt32 = static_cast<int32_t>(size);
77 std::string fuzzedString(reinterpret_cast<const char *>(data), size);
78 auto fuzzedBool = static_cast<bool>(data[0] % 2);
79 auto fuzzUint32 = static_cast<uint32_t>(size);
80 static std::vector<FullImeInfo> infos;
81 FullImeInfo imeInfo = { .isNewIme = fuzzedBool, .tokenId = fuzzUint32, .appId = fuzzedString,
82 .versionCode = fuzzUint32 };
83 infos.push_back(imeInfo);
84 FullImeInfoManager::GetInstance().Switch(fuzzInt32);
85 FullImeInfoManager::GetInstance().Update();
86 FullImeInfoManager::GetInstance().Delete(fuzzInt32);
87 FullImeInfoManager::GetInstance().Add(fuzzInt32, fuzzedString);
88 FullImeInfoManager::GetInstance().Delete(fuzzInt32, fuzzedString);
89 FullImeInfoManager::GetInstance().Update(fuzzInt32, fuzzedString);
90 FullImeInfoManager::GetInstance().Has(fuzzInt32, fuzzedString);
91 FullImeInfoManager::GetInstance().AddUser(fuzzInt32, infos);
92 FullImeInfoManager::GetInstance().AddPackage(fuzzInt32, fuzzedString, imeInfo);
93 FullImeInfoManager::GetInstance().DeletePackage(fuzzInt32, fuzzedString);
94 }
95 } // namespace OHOS
96 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)97 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
98 {
99 /* Run your code on data */
100 OHOS::FuzzAgentStub(data, size);
101 OHOS::FuzzFullImeInfo(data, size);
102 return 0;
103 }