• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "imeenabledinfomanager_fuzzer.h"
17 
18 #define private public
19 #define protected public
20 #include "ime_enabled_info_manager.h"
21 #undef private
22 #include "fuzzer/FuzzedDataProvider.h"
23 
24 using namespace OHOS::MiscServices;
25 namespace OHOS {
26 const int8_t EVEN_CHECK_NUMBER = 2;
GetString(const uint8_t * data,size_t size)27 std::string GetString(const uint8_t *data, size_t size)
28 {
29     if (data == nullptr || size == 0) {
30         return "";
31     }
32     return std::string(reinterpret_cast<const char *>(data), size);
33 }
34 
FuzzInit(const uint8_t * data,size_t size)35 void FuzzInit(const uint8_t *data, size_t size)
36 {
37     FuzzedDataProvider provider(data, size);
38     auto userId = provider.ConsumeIntegral<int32_t>();
39     auto fuzzedString = GetString(data, size);
40     std::map<int32_t, std::vector<FullImeInfo>> fullImeInfos;
41     std::vector<FullImeInfo> imeInfos;
42     for (size_t i = 0; i < size; i++) {
43         FullImeInfo imeInfo;
44         imeInfo.prop.name = fuzzedString + std::to_string(i);
45         imeInfo.prop.id = std::to_string(i) + fuzzedString;
46         imeInfos.push_back(imeInfo);
47     }
48     fullImeInfos.insert({ userId, imeInfos });
49     ImeEnabledInfoManager::GetInstance().Init(fullImeInfos);
50 }
51 
FuzzSwitch(const uint8_t * data,size_t size)52 void FuzzSwitch(const uint8_t *data, size_t size)
53 {
54     FuzzedDataProvider provider(data, size);
55     auto userId = provider.ConsumeIntegral<int32_t>();
56     auto fuzzedString = GetString(data, size);
57     std::vector<FullImeInfo> imeInfos;
58     for (size_t i = 0; i < size; i++) {
59         FullImeInfo imeInfo;
60         imeInfo.prop.name = fuzzedString + std::to_string(i);
61         imeInfo.prop.id = std::to_string(i) + fuzzedString;
62         imeInfos.push_back(imeInfo);
63     }
64     ImeEnabledInfoManager::GetInstance().Switch(userId, imeInfos);
65 }
66 
FuzzDelete(const uint8_t * data,size_t size)67 void FuzzDelete(const uint8_t *data, size_t size)
68 {
69     FuzzedDataProvider provider(data, size);
70     auto userId = provider.ConsumeIntegral<int32_t>();
71     ImeEnabledInfoManager::GetInstance().Delete(userId);
72 }
73 
FuzzAddPackage(const uint8_t * data,size_t size)74 void FuzzAddPackage(const uint8_t *data, size_t size)
75 {
76     FuzzedDataProvider provider(data, size);
77     auto userId = provider.ConsumeIntegral<int32_t>();
78     auto fuzzedString = GetString(data, size);
79     FullImeInfo imeInfo;
80     imeInfo.prop.name = fuzzedString;
81     imeInfo.prop.id = fuzzedString + "ext";
82     ImeEnabledInfoManager::GetInstance().Add(userId, imeInfo);
83 }
84 
FuzzDeletePackage(const uint8_t * data,size_t size)85 void FuzzDeletePackage(const uint8_t *data, size_t size)
86 {
87     FuzzedDataProvider provider(data, size);
88     auto userId = provider.ConsumeIntegral<int32_t>();
89     auto fuzzedString = GetString(data, size);
90     ImeEnabledInfoManager::GetInstance().Delete(userId, fuzzedString);
91 }
92 
FuzzUpdateEnabledStatus(const uint8_t * data,size_t size)93 void FuzzUpdateEnabledStatus(const uint8_t *data, size_t size)
94 {
95     FuzzedDataProvider provider(data, size);
96     auto userId = provider.ConsumeIntegral<int32_t>();
97     auto enabledStatus = static_cast<EnabledStatus>(size);
98     auto fuzzedString = GetString(data, size);
99     ImeEnabledInfoManager::GetInstance().Update(userId, fuzzedString, fuzzedString + "ext", enabledStatus);
100 }
101 
FuzzGetEnabledState(const uint8_t * data,size_t size)102 void FuzzGetEnabledState(const uint8_t *data, size_t size)
103 {
104     FuzzedDataProvider provider(data, size);
105     auto userId = provider.ConsumeIntegral<int32_t>();
106     auto fuzzedString = GetString(data, size);
107     auto enabledStatus = EnabledStatus::DISABLED;
108     ImeEnabledInfoManager::GetInstance().GetEnabledState(userId, fuzzedString, enabledStatus);
109 }
110 
FuzzGetEnabledStates(const uint8_t * data,size_t size)111 void FuzzGetEnabledStates(const uint8_t *data, size_t size)
112 {
113     FuzzedDataProvider provider(data, size);
114     auto userId = provider.ConsumeIntegral<int32_t>();
115     auto fuzzedString = GetString(data, size);
116     std::vector<Property> props;
117     for (size_t i = 0; i < size; i++) {
118         Property prop;
119         prop.name = fuzzedString + std::to_string(i);
120         prop.id = std::to_string(i) + fuzzedString;
121         props.push_back(prop);
122     }
123     ImeEnabledInfoManager::GetInstance().GetEnabledStates(userId, props);
124 }
125 
FuzzIsDefaultFullMode(const uint8_t * data,size_t size)126 void FuzzIsDefaultFullMode(const uint8_t *data, size_t size)
127 {
128     FuzzedDataProvider provider(data, size);
129     auto userId = provider.ConsumeIntegral<int32_t>();
130     auto fuzzedString = GetString(data, size);
131     ImeEnabledInfoManager::GetInstance().IsDefaultFullMode(userId, fuzzedString);
132 }
133 
FuzzSetCurrentIme(const uint8_t * data,size_t size)134 void FuzzSetCurrentIme(const uint8_t *data, size_t size)
135 {
136     FuzzedDataProvider provider(data, size);
137     auto userId = provider.ConsumeIntegral<int32_t>();
138     auto fuzzedString = GetString(data, size);
139     std::string imeId = fuzzedString;
140     if (size % EVEN_CHECK_NUMBER == 0) {
141         imeId = fuzzedString + "/" + "ext";
142     }
143     bool isSetByUser = false;
144     if (data != nullptr && size != 0) {
145         isSetByUser = static_cast<bool>(data[0] % 2); // remainder 2 can generate a random number of 0 or 1
146     }
147     ImeEnabledInfoManager::GetInstance().SetCurrentIme(userId, imeId, fuzzedString, isSetByUser);
148 }
149 
FuzzSetTmpIme(const uint8_t * data,size_t size)150 void FuzzSetTmpIme(const uint8_t *data, size_t size)
151 {
152     FuzzedDataProvider provider(data, size);
153     auto userId = provider.ConsumeIntegral<int32_t>();
154     auto fuzzedString = GetString(data, size);
155     std::string imeId = fuzzedString;
156     if (size % EVEN_CHECK_NUMBER == 0) {
157         imeId = fuzzedString + "/" + "ext";
158     }
159     ImeEnabledInfoManager::GetInstance().SetTmpIme(userId, imeId);
160 }
161 
FuzzGetCurrentImeCfg(const uint8_t * data,size_t size)162 void FuzzGetCurrentImeCfg(const uint8_t *data, size_t size)
163 {
164     FuzzedDataProvider provider(data, size);
165     auto userId = provider.ConsumeIntegral<int32_t>();
166     ImeEnabledInfoManager::GetInstance().GetCurrentImeCfg(userId);
167 }
168 
FuzzIsDefaultImeSet(const uint8_t * data,size_t size)169 void FuzzIsDefaultImeSet(const uint8_t *data, size_t size)
170 {
171     FuzzedDataProvider provider(data, size);
172     auto userId = provider.ConsumeIntegral<int32_t>();
173     ImeEnabledInfoManager::GetInstance().IsDefaultImeSet(userId);
174 }
175 
FuzzOnFullExperienceTableChanged(const uint8_t * data,size_t size)176 void FuzzOnFullExperienceTableChanged(const uint8_t *data, size_t size)
177 {
178     FuzzedDataProvider provider(data, size);
179     auto userId = provider.ConsumeIntegral<int32_t>();
180     ImeEnabledInfoManager::GetInstance().OnFullExperienceTableChanged(userId);
181 }
182 
FuzzGetEnabledStateInner(const uint8_t * data,size_t size)183 void FuzzGetEnabledStateInner(const uint8_t *data, size_t size)
184 {
185     FuzzedDataProvider provider(data, size);
186     static std::vector<Property> props;
187     static std::vector<FullImeInfo> imeInfos;
188     static std::vector<ImeEnabledInfo> enabledInfos;
189     auto fuzzedString = GetString(data, size);
190     for (size_t i = 0; i < size; i++) {
191         Property prop;
192         prop.name = fuzzedString + std::to_string(i);
193         prop.id = std::to_string(i) + fuzzedString;
194         props.push_back(prop);
195     }
196     auto userId = provider.ConsumeIntegral<int32_t>();
197     auto fuzzedBool = static_cast<bool>(data[0] % 2);
198     auto fuzzUint32 = provider.ConsumeIntegral<uint32_t>();
199     auto fuzzInt32 = provider.ConsumeIntegral<int32_t>();
200     EnabledStatus status = static_cast<EnabledStatus>(fuzzInt32);
201     FullImeInfo imeInfo = { .isNewIme = fuzzedBool, .tokenId = fuzzUint32, .appId = fuzzedString,
202         .versionCode = fuzzUint32 };
203     ImeEnabledInfo imeEnabeleInfo;
204     imeEnabeleInfo.bundleName = fuzzedString;
205     imeEnabeleInfo.extensionName = fuzzedString;
206     imeEnabeleInfo.enabledStatus = static_cast<EnabledStatus>(fuzzInt32);
207     imeEnabeleInfo.stateUpdateTime = fuzzedString;
208     enabledInfos.push_back(imeEnabeleInfo);
209     ImeEnabledCfg newEnabledCfg;
210     newEnabledCfg.version = fuzzedString;
211     newEnabledCfg.enabledInfos = enabledInfos;
212     ImeEnabledInfoManager::GetInstance().GetEnabledStateInner(userId, fuzzedString, status);
213     ImeEnabledInfoManager::GetInstance().GetEnabledStatesInner(userId, props);
214     ImeEnabledInfoManager::GetInstance().IsInEnabledCache(userId, fuzzedString, fuzzedString);
215     ImeEnabledInfoManager::GetInstance().CorrectByBundleMgr(userId, imeInfos, enabledInfos);
216     ImeEnabledInfoManager::GetInstance().ComputeEnabledStatus(fuzzedString, status);
217     ImeEnabledInfoManager::GetInstance().UpdateEnabledCfgCache(userId, newEnabledCfg);
218     ImeEnabledInfoManager::GetInstance().NotifyCurrentImeStatusChanged(userId, fuzzedString, status);
219     ImeEnabledInfoManager::GetInstance().IsExpired(fuzzedString);
220     ImeEnabledInfoManager::GetInstance().UpdateGlobalEnabledTable(userId, newEnabledCfg);
221     ImeEnabledInfoManager::GetInstance().ModCurrentIme(enabledInfos);
222     ImeEnabledInfoManager::GetInstance().IsCurrentIme(fuzzedString, enabledInfos);
223 }
224 } // namespace OHOS
225 
226 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)227 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
228 {
229     OHOS::FuzzInit(data, size);
230     OHOS::FuzzSwitch(data, size);
231     OHOS::FuzzDelete(data, size);
232     OHOS::FuzzAddPackage(data, size);
233     OHOS::FuzzDeletePackage(data, size);
234     OHOS::FuzzUpdateEnabledStatus(data, size);
235     OHOS::FuzzGetEnabledState(data, size);
236     OHOS::FuzzGetEnabledStates(data, size);
237     OHOS::FuzzIsDefaultFullMode(data, size);
238     OHOS::FuzzSetCurrentIme(data, size);
239     OHOS::FuzzSetTmpIme(data, size);
240     OHOS::FuzzGetCurrentImeCfg(data, size);
241     OHOS::FuzzIsDefaultImeSet(data, size);
242     OHOS::FuzzOnFullExperienceTableChanged(data, size);
243     OHOS::FuzzGetEnabledStateInner(data, size);
244     return 0;
245 }