• 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 #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 }