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 #define private public
17 #define protected public
18 #include "ima_hisysevent_reporter.h"
19 #include "imc_hisysevent_reporter.h"
20 #include "imf_hisysevent_info.h"
21 #include "imf_hisysevent_reporter.h"
22 #include "imf_hisysevent_util.h"
23 #include "imsa_hisysevent_reporter.h"
24 #include "inputmethod_sysevent.h"
25 #undef private
26
27 #include <sys/time.h>
28 #include <unistd.h>
29
30 #include <condition_variable>
31 #include <cstdint>
32 #include <string>
33
34 #include "fuzzer/FuzzedDataProvider.h"
35 #include "global.h"
36 #include "hisysevent_base_manager.h"
37 #include "hisysevent_listener.h"
38 #include "hisysevent_manager.h"
39 #include "hisysevent_query_callback.h"
40 #include "hisysevent_record.h"
41 #include "imfhisyseventreport_fuzzer.h"
42
43 using namespace OHOS::MiscServices;
44 namespace OHOS {
45 using namespace OHOS::HiviewDFX;
46 constexpr ClientType PARAM_CLIENT_TYPE = ClientType::INNER_KIT;
47 constexpr int32_t PARAM_INPUT_PATTERN = 6;
TestClientAttach01(const uint8_t * data,size_t size)48 void TestClientAttach01(const uint8_t *data, size_t size)
49 {
50 auto errCode = static_cast<int32_t>(size);
51 auto paramIsShowkeyboard = static_cast<bool>(data[0] % 2);
52 auto info = HiSysOriginalInfo::Builder()
53 .SetErrCode(errCode)
54 .SetInputPattern(PARAM_INPUT_PATTERN)
55 .SetIsShowKeyboard(paramIsShowkeyboard)
56 .SetClientType(PARAM_CLIENT_TYPE)
57 .Build();
58 ImcHiSysEventReporter::GetInstance().ReportEvent(ImfEventType::CLIENT_ATTACH, *info);
59 }
60
TestClientAttach02(const uint8_t * data,size_t size)61 void TestClientAttach02(const uint8_t *data, size_t size)
62 {
63 FuzzedDataProvider provider(data, size);
64 std::string fuzzedString(reinterpret_cast<const char *>(data), size);
65 auto paramPeerName = fuzzedString;
66 auto paramPeerUserId = provider.ConsumeIntegral<int32_t>();
67 auto paramPeerPid = provider.ConsumeIntegral<int64_t>();
68 auto errCode = provider.ConsumeIntegral<int32_t>();
69 auto paramIsShowkeyboard = provider.ConsumeBool();
70 auto paramImeName = fuzzedString;
71 auto info = HiSysOriginalInfo::Builder()
72 .SetPeerName(paramPeerName)
73 .SetPeerPid(paramPeerPid)
74 .SetPeerUserId(paramPeerUserId)
75 .SetClientType(PARAM_CLIENT_TYPE)
76 .SetInputPattern(PARAM_INPUT_PATTERN)
77 .SetIsShowKeyboard(paramIsShowkeyboard)
78 .SetImeName(paramImeName)
79 .SetErrCode(errCode)
80 .Build();
81 ImsaHiSysEventReporter::GetInstance().ReportEvent(ImfEventType::CLIENT_ATTACH, *info);
82 }
83
TestClientShow(const uint8_t * data,size_t size)84 void TestClientShow(const uint8_t *data, size_t size)
85 {
86 FuzzedDataProvider provider(data, size);
87 std::string fuzzedString(reinterpret_cast<const char *>(data), size);
88 auto paramPeerName = fuzzedString;
89 auto paramPeerUserId = provider.ConsumeIntegral<int32_t>();
90 auto paramPeerPid = provider.ConsumeIntegral<int64_t>();
91 auto errCode = provider.ConsumeIntegral<int32_t>();
92 auto paramIEventCode = provider.ConsumeIntegral<int32_t>();
93 auto paramImeName = fuzzedString;
94 auto info = HiSysOriginalInfo::Builder()
95 .SetPeerName(paramPeerName)
96 .SetPeerPid(paramPeerPid)
97 .SetPeerUserId(paramPeerUserId)
98 .SetClientType(PARAM_CLIENT_TYPE)
99 .SetImeName(paramImeName)
100 .SetEventCode(paramIEventCode)
101 .SetErrCode(errCode)
102 .Build();
103 ImcHiSysEventReporter::GetInstance().ReportEvent(ImfEventType::CLIENT_SHOW, *info);
104 }
105
TestStartInput(const uint8_t * data,size_t size)106 void TestStartInput(const uint8_t *data, size_t size)
107 {
108 FuzzedDataProvider provider(data, size);
109 std::string fuzzedString(reinterpret_cast<const char *>(data), size);
110 auto paramPeerName = fuzzedString;
111 auto paramPeerPid = provider.ConsumeIntegral<int64_t>();
112 auto errCode = provider.ConsumeIntegral<int32_t>();
113 auto paramIsShowkeyboard = provider.ConsumeBool();
114 auto paramIEventCode = provider.ConsumeIntegral<int32_t>();
115 auto info = HiSysOriginalInfo::Builder()
116 .SetPeerName(paramPeerName)
117 .SetPeerPid(paramPeerPid)
118 .SetIsShowKeyboard(paramIsShowkeyboard)
119 .SetEventCode(paramIEventCode)
120 .SetErrCode(errCode)
121 .Build();
122 ImaHiSysEventReporter::GetInstance().ReportEvent(ImfEventType::IME_START_INPUT, *info);
123 }
124
TestBaseTextOperation(const uint8_t * data,size_t size)125 void TestBaseTextOperation(const uint8_t *data, size_t size)
126 {
127 FuzzedDataProvider provider(data, size);
128 std::string fuzzedString(reinterpret_cast<const char *>(data), size);
129 auto paramPeerName = fuzzedString;
130 auto paramPeerPid = provider.ConsumeIntegral<int64_t>();
131 auto errCode = provider.ConsumeIntegral<int32_t>();
132 auto paramIEventCode = provider.ConsumeIntegral<int32_t>();
133 auto info = HiSysOriginalInfo::Builder()
134 .SetPeerName(paramPeerName)
135 .SetPeerPid(paramPeerPid)
136 .SetClientType(PARAM_CLIENT_TYPE)
137 .SetEventCode(paramIEventCode)
138 .SetErrCode(errCode)
139 .Build();
140 ImaHiSysEventReporter::GetInstance().ReportEvent(ImfEventType::BASE_TEXT_OPERATOR, *info);
141 }
142
TestRecordBaseTextOperationStatistics(const uint8_t * data,size_t size)143 void TestRecordBaseTextOperationStatistics(const uint8_t *data, size_t size)
144 {
145 FuzzedDataProvider provider(data, size);
146 auto code = provider.ConsumeIntegral<int32_t>();
147 auto info = HiSysOriginalInfo::Builder()
148 .SetErrCode(code)
149 .Build();
150 ImaHiSysEventReporter::GetInstance().RecordBaseTextOperationStatistics(*info);
151 ImaHiSysEventReporter::GetInstance().RecordImeStartInputStatistics(*info);
152 }
153
TestIntervalIndex(const uint8_t * data,size_t size)154 void TestIntervalIndex(const uint8_t *data, size_t size)
155 {
156 FuzzedDataProvider provider(data, size);
157 auto fuzzInt32 = provider.ConsumeIntegral<int32_t>();
158 ImaHiSysEventReporter::GetInstance().GetBaseTextOperationSucceedIntervalIndex(fuzzInt32);
159 ImaHiSysEventReporter::GetInstance().ReportStatisticsEvent();
160 ImaHiSysEventReporter::GetInstance().ModImeCbTimeConsumeInfo(fuzzInt32);
161 }
162
TestInputMethodSysEvent(const uint8_t * data,size_t size)163 void TestInputMethodSysEvent(const uint8_t *data, size_t size)
164 {
165 FuzzedDataProvider provider(data, size);
166 auto fuzzInt32 = provider.ConsumeIntegral<int32_t>();
167 auto fuzzUint32 = provider.ConsumeIntegral<uint32_t>();
168 std::string fuzzedString(reinterpret_cast<const char *>(data), size);
169 using TimerCallback = std::function<void()>;
170 TimerCallback tc;
171 InputMethodSysEvent::GetInstance().ServiceFaultReporter(fuzzedString, fuzzInt32);
172 InputMethodSysEvent::GetInstance().ImeUsageBehaviourReporter();
173 InputMethodSysEvent::GetInstance().GetOperateInfo(fuzzInt32);
174 InputMethodSysEvent::GetInstance().StartTimer(tc, fuzzUint32);
175 InputMethodSysEvent::GetInstance().StartTimerForReport();
176 InputMethodSysEvent::GetInstance().ReportSystemShortCut(fuzzedString);
177 }
178
TestOnDemandStartStopSa(const uint8_t * data,size_t size)179 void TestOnDemandStartStopSa(const uint8_t *data, size_t size)
180 {
181 FuzzedDataProvider provider(data, size);
182 auto fuzzInt32 = provider.ConsumeIntegral<int32_t>();
183 auto fuzzUint32 = provider.ConsumeIntegral<uint32_t>();
184 std::string fuzzedString(reinterpret_cast<const char *>(data), size);
185 using TimerCallback = std::function<void()>;
186 TimerCallback tc;
187 InputMethodSysEvent::GetInstance().ServiceFaultReporter(fuzzedString, fuzzInt32);
188 InputMethodSysEvent::GetInstance().ImeUsageBehaviourReporter();
189 InputMethodSysEvent::GetInstance().GetOperateInfo(fuzzInt32);
190 InputMethodSysEvent::GetInstance().StartTimer(tc, fuzzUint32);
191 InputMethodSysEvent::GetInstance().StartTimerForReport();
192 InputMethodSysEvent::GetInstance().ReportSystemShortCut(fuzzedString);
193 }
194
TestReportStatisticsEvent(const uint8_t * data,size_t size)195 void TestReportStatisticsEvent(const uint8_t *data, size_t size)
196 {
197 std::string fuzzedString(reinterpret_cast<const char *>(data), size);
198 static std::vector<std::string> appNames;
199 static std::vector<std::string> statistics;
200 appNames.push_back(fuzzedString);
201 statistics.push_back(fuzzedString);
202 ImsaHiSysEventReporter::GetInstance().ReportStatisticsEvent();
203 ImfHiSysEventUtil::ReportStatisticsEvent(fuzzedString, fuzzedString, appNames, statistics);
204 }
205 } // namespace OHOS
206
207 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)208 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
209 {
210 if (data == nullptr || size == 0) {
211 return 0;
212 }
213 /* Run your code on data */
214 OHOS::TestClientAttach01(data, size);
215 OHOS::TestClientAttach02(data, size);
216 OHOS::TestClientShow(data, size);
217 OHOS::TestStartInput(data, size);
218 OHOS::TestBaseTextOperation(data, size);
219 OHOS::TestRecordBaseTextOperationStatistics(data, size);
220 OHOS::TestIntervalIndex(data, size);
221 OHOS::TestInputMethodSysEvent(data, size);
222 OHOS::TestReportStatisticsEvent(data, size);
223 return 0;
224 }