1 /*
2 * Copyright (c) 2022 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 "formfreeinstalloperator_fuzzer.h"
17
18 #include <cstddef>
19 #include <cstdint>
20
21 #include "feature/form_share/form_free_install_operator.h"
22 #include "form_host/form_host_callback.h"
23 #include "securec.h"
24
25 using namespace OHOS::AppExecFwk;
26
27 namespace OHOS {
28 constexpr size_t U32_AT_SIZE = 4;
GetU32Data(const char * ptr)29 uint32_t GetU32Data(const char* ptr)
30 {
31 // convert fuzz input data to an integer
32 return (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
33 }
DoSomethingInterestingWithMyAPI(const char * data,size_t size)34 bool DoSomethingInterestingWithMyAPI(const char* data, size_t size)
35 {
36 std::string formShareInfoKey(data, size);
37 FormFreeInstallOperator formFreeInstallOperator(formShareInfoKey, nullptr);
38 int32_t resultCode = static_cast<int32_t>(GetU32Data(data));
39 formFreeInstallOperator.OnInstallFinished(resultCode);
40 std::shared_ptr<FormFreeInstallOperator> freeInstallOperators = nullptr;
41 std::weak_ptr<FormFreeInstallOperator> freeInstallOperator = freeInstallOperators;
42 FreeInstallStatusCallBack freeInstallStatusCallBack(freeInstallOperator);
43 Want want;
44 int32_t userId = static_cast<int32_t>(GetU32Data(data));
45 freeInstallStatusCallBack.OnInstallFinished(resultCode, want, userId);
46 FormHostCallback formHostCallback;
47 int64_t formId = static_cast<int32_t>(GetU32Data(data));
48 FormRecord record;
49 sptr<IRemoteObject> callerToken = nullptr;
50 formHostCallback.OnAcquired(formId, record, callerToken);
51 formHostCallback.OnUpdate(formId, record, callerToken);
52 std::vector<int64_t> formIds;
53 formIds.emplace_back(formId);
54 formHostCallback.OnUninstall(formIds, callerToken);
55 AppExecFwk::FormState state = AppExecFwk::FormState::UNKNOWN;
56 AAFwk::Want wants;
57 formHostCallback.OnAcquireState(state, wants, callerToken);
58 std::string bundleName(data, size);
59 std::string abilityName(data, size);
60 std::string moduleName(data, size);
61 return formFreeInstallOperator.StartFreeInstall(bundleName, moduleName, abilityName);
62 }
63
DoSomethingInterestingWithMyAPI1(const char * data,size_t size)64 bool DoSomethingInterestingWithMyAPI1(const char* data, size_t size)
65 {
66 std::string formShareInfoKey(data, size);
67 FormFreeInstallOperator formFreeInstallOperator(formShareInfoKey, nullptr);
68 int32_t resultCode = static_cast<int32_t>(GetU32Data(data));
69 formFreeInstallOperator.OnInstallFinished(resultCode);
70 std::shared_ptr<FormFreeInstallOperator> freeInstallOperators = nullptr;
71 std::weak_ptr<FormFreeInstallOperator> freeInstallOperator = freeInstallOperators;
72 FreeInstallStatusCallBack freeInstallStatusCallBack(freeInstallOperator);
73 Want want;
74 int32_t userId = static_cast<int32_t>(GetU32Data(data));
75 freeInstallStatusCallBack.OnInstallFinished(resultCode, want, userId);
76 FormHostCallback formHostCallback;
77 int64_t formId = static_cast<int32_t>(GetU32Data(data));
78 FormRecord record;
79 sptr<IRemoteObject> callerToken = nullptr;
80 formHostCallback.OnAcquired(formId, record, callerToken);
81 formHostCallback.OnUpdate(formId, record, callerToken);
82 std::vector<int64_t> formIds;
83 formIds.emplace_back(formId);
84 formHostCallback.OnUninstall(formIds, callerToken);
85 AppExecFwk::FormState state = AppExecFwk::FormState::UNKNOWN;
86 AAFwk::Want wants;
87 formHostCallback.OnAcquireState(state, wants, callerToken);
88 std::string bundleName(data, size);
89 std::string abilityName(data, size);
90 std::string moduleName(data, size);
91 return formFreeInstallOperator.StartFreeInstall(bundleName, moduleName, abilityName);
92 }
93
DoSomethingInterestingWithMyAPI2(const char * data,size_t size)94 bool DoSomethingInterestingWithMyAPI2(const char* data, size_t size)
95 {
96 std::string formShareInfoKey(data, size);
97 FormFreeInstallOperator formFreeInstallOperator(formShareInfoKey, nullptr);
98 int32_t resultCode = static_cast<int32_t>(GetU32Data(data));
99 formFreeInstallOperator.OnInstallFinished(resultCode);
100 std::shared_ptr<FormFreeInstallOperator> freeInstallOperators = nullptr;
101 std::weak_ptr<FormFreeInstallOperator> freeInstallOperator = freeInstallOperators;
102 FreeInstallStatusCallBack freeInstallStatusCallBack(freeInstallOperator);
103 Want want;
104 int32_t userId = static_cast<int32_t>(GetU32Data(data));
105 freeInstallStatusCallBack.OnInstallFinished(resultCode, want, userId);
106 FormHostCallback formHostCallback;
107 int64_t formId = static_cast<int32_t>(GetU32Data(data));
108 FormRecord record;
109 sptr<IRemoteObject> callerToken = nullptr;
110 formHostCallback.OnAcquired(formId, record, callerToken);
111 formHostCallback.OnUpdate(formId, record, callerToken);
112 std::vector<int64_t> formIds;
113 formIds.emplace_back(formId);
114 formHostCallback.OnUninstall(formIds, callerToken);
115 AppExecFwk::FormState state = AppExecFwk::FormState::UNKNOWN;
116 AAFwk::Want wants;
117 formHostCallback.OnAcquireState(state, wants, callerToken);
118 std::string bundleName(data, size);
119 std::string abilityName(data, size);
120 std::string moduleName(data, size);
121 return formFreeInstallOperator.StartFreeInstall(bundleName, moduleName, abilityName);
122 }
123
DoSomethingInterestingWithMyAPI3(const char * data,size_t size)124 bool DoSomethingInterestingWithMyAPI3(const char* data, size_t size)
125 {
126 std::string formShareInfoKey(data, size);
127 FormFreeInstallOperator formFreeInstallOperator(formShareInfoKey, nullptr);
128 int32_t resultCode = static_cast<int32_t>(GetU32Data(data));
129 formFreeInstallOperator.OnInstallFinished(resultCode);
130 std::shared_ptr<FormFreeInstallOperator> freeInstallOperators = nullptr;
131 std::weak_ptr<FormFreeInstallOperator> freeInstallOperator = freeInstallOperators;
132 FreeInstallStatusCallBack freeInstallStatusCallBack(freeInstallOperator);
133 Want want;
134 int32_t userId = static_cast<int32_t>(GetU32Data(data));
135 freeInstallStatusCallBack.OnInstallFinished(resultCode, want, userId);
136 FormHostCallback formHostCallback;
137 int64_t formId = static_cast<int32_t>(GetU32Data(data));
138 FormRecord record;
139 sptr<IRemoteObject> callerToken = nullptr;
140 formHostCallback.OnAcquired(formId, record, callerToken);
141 formHostCallback.OnUpdate(formId, record, callerToken);
142 std::vector<int64_t> formIds;
143 formIds.emplace_back(formId);
144 formHostCallback.OnUninstall(formIds, callerToken);
145 AppExecFwk::FormState state = AppExecFwk::FormState::UNKNOWN;
146 AAFwk::Want wants;
147 formHostCallback.OnAcquireState(state, wants, callerToken);
148 std::string bundleName(data, size);
149 std::string abilityName(data, size);
150 std::string moduleName(data, size);
151 return formFreeInstallOperator.StartFreeInstall(bundleName, moduleName, abilityName);
152 }
153
DoSomethingInterestingWithMyAPI4(const char * data,size_t size)154 bool DoSomethingInterestingWithMyAPI4(const char* data, size_t size)
155 {
156 std::string formShareInfoKey(data, size);
157 FormFreeInstallOperator formFreeInstallOperator(formShareInfoKey, nullptr);
158 int32_t resultCode = static_cast<int32_t>(GetU32Data(data));
159 formFreeInstallOperator.OnInstallFinished(resultCode);
160 std::shared_ptr<FormFreeInstallOperator> freeInstallOperators = nullptr;
161 std::weak_ptr<FormFreeInstallOperator> freeInstallOperator = freeInstallOperators;
162 FreeInstallStatusCallBack freeInstallStatusCallBack(freeInstallOperator);
163 Want want;
164 int32_t userId = static_cast<int32_t>(GetU32Data(data));
165 freeInstallStatusCallBack.OnInstallFinished(resultCode, want, userId);
166 FormHostCallback formHostCallback;
167 int64_t formId = static_cast<int32_t>(GetU32Data(data));
168 FormRecord record;
169 sptr<IRemoteObject> callerToken = nullptr;
170 formHostCallback.OnAcquired(formId, record, callerToken);
171 formHostCallback.OnUpdate(formId, record, callerToken);
172 std::vector<int64_t> formIds;
173 formIds.emplace_back(formId);
174 formHostCallback.OnUninstall(formIds, callerToken);
175 AppExecFwk::FormState state = AppExecFwk::FormState::UNKNOWN;
176 AAFwk::Want wants;
177 formHostCallback.OnAcquireState(state, wants, callerToken);
178 std::string bundleName(data, size);
179 std::string abilityName(data, size);
180 std::string moduleName(data, size);
181 return formFreeInstallOperator.StartFreeInstall(bundleName, moduleName, abilityName);
182 }
183
DoSomethingInterestingWithMyAPI5(const char * data,size_t size)184 bool DoSomethingInterestingWithMyAPI5(const char* data, size_t size)
185 {
186 std::string formShareInfoKey(data, size);
187 FormFreeInstallOperator formFreeInstallOperator(formShareInfoKey, nullptr);
188 int32_t resultCode = static_cast<int32_t>(GetU32Data(data));
189 formFreeInstallOperator.OnInstallFinished(resultCode);
190 std::shared_ptr<FormFreeInstallOperator> freeInstallOperators = nullptr;
191 std::weak_ptr<FormFreeInstallOperator> freeInstallOperator = freeInstallOperators;
192 FreeInstallStatusCallBack freeInstallStatusCallBack(freeInstallOperator);
193 Want want;
194 int32_t userId = static_cast<int32_t>(GetU32Data(data));
195 freeInstallStatusCallBack.OnInstallFinished(resultCode, want, userId);
196 FormHostCallback formHostCallback;
197 int64_t formId = static_cast<int32_t>(GetU32Data(data));
198 FormRecord record;
199 sptr<IRemoteObject> callerToken = nullptr;
200 formHostCallback.OnAcquired(formId, record, callerToken);
201 formHostCallback.OnUpdate(formId, record, callerToken);
202 std::vector<int64_t> formIds;
203 formIds.emplace_back(formId);
204 formHostCallback.OnUninstall(formIds, callerToken);
205 AppExecFwk::FormState state = AppExecFwk::FormState::UNKNOWN;
206 AAFwk::Want wants;
207 formHostCallback.OnAcquireState(state, wants, callerToken);
208 std::string bundleName(data, size);
209 std::string abilityName(data, size);
210 std::string moduleName(data, size);
211 return formFreeInstallOperator.StartFreeInstall(bundleName, moduleName, abilityName);
212 }
213
DoSomethingInterestingWithMyAPI6(const char * data,size_t size)214 bool DoSomethingInterestingWithMyAPI6(const char* data, size_t size)
215 {
216 std::string formShareInfoKey(data, size);
217 FormFreeInstallOperator formFreeInstallOperator(formShareInfoKey, nullptr);
218 int32_t resultCode = static_cast<int32_t>(GetU32Data(data));
219 formFreeInstallOperator.OnInstallFinished(resultCode);
220 std::shared_ptr<FormFreeInstallOperator> freeInstallOperators = nullptr;
221 std::weak_ptr<FormFreeInstallOperator> freeInstallOperator = freeInstallOperators;
222 FreeInstallStatusCallBack freeInstallStatusCallBack(freeInstallOperator);
223 Want want;
224 int32_t userId = static_cast<int32_t>(GetU32Data(data));
225 freeInstallStatusCallBack.OnInstallFinished(resultCode, want, userId);
226 FormHostCallback formHostCallback;
227 int64_t formId = static_cast<int32_t>(GetU32Data(data));
228 FormRecord record;
229 sptr<IRemoteObject> callerToken = nullptr;
230 formHostCallback.OnAcquired(formId, record, callerToken);
231 formHostCallback.OnUpdate(formId, record, callerToken);
232 std::vector<int64_t> formIds;
233 formIds.emplace_back(formId);
234 formHostCallback.OnUninstall(formIds, callerToken);
235 AppExecFwk::FormState state = AppExecFwk::FormState::UNKNOWN;
236 AAFwk::Want wants;
237 formHostCallback.OnAcquireState(state, wants, callerToken);
238 std::string bundleName(data, size);
239 std::string abilityName(data, size);
240 std::string moduleName(data, size);
241 return formFreeInstallOperator.StartFreeInstall(bundleName, moduleName, abilityName);
242 }
243
DoSomethingInterestingWithMyAPI7(const char * data,size_t size)244 bool DoSomethingInterestingWithMyAPI7(const char* data, size_t size)
245 {
246 std::string formShareInfoKey(data, size);
247 FormFreeInstallOperator formFreeInstallOperator(formShareInfoKey, nullptr);
248 int32_t resultCode = static_cast<int32_t>(GetU32Data(data));
249 formFreeInstallOperator.OnInstallFinished(resultCode);
250 std::shared_ptr<FormFreeInstallOperator> freeInstallOperators = nullptr;
251 std::weak_ptr<FormFreeInstallOperator> freeInstallOperator = freeInstallOperators;
252 FreeInstallStatusCallBack freeInstallStatusCallBack(freeInstallOperator);
253 Want want;
254 int32_t userId = static_cast<int32_t>(GetU32Data(data));
255 freeInstallStatusCallBack.OnInstallFinished(resultCode, want, userId);
256 FormHostCallback formHostCallback;
257 int64_t formId = static_cast<int32_t>(GetU32Data(data));
258 FormRecord record;
259 sptr<IRemoteObject> callerToken = nullptr;
260 formHostCallback.OnAcquired(formId, record, callerToken);
261 formHostCallback.OnUpdate(formId, record, callerToken);
262 std::vector<int64_t> formIds;
263 formIds.emplace_back(formId);
264 formHostCallback.OnUninstall(formIds, callerToken);
265 AppExecFwk::FormState state = AppExecFwk::FormState::UNKNOWN;
266 AAFwk::Want wants;
267 formHostCallback.OnAcquireState(state, wants, callerToken);
268 std::string bundleName(data, size);
269 std::string abilityName(data, size);
270 std::string moduleName(data, size);
271 return formFreeInstallOperator.StartFreeInstall(bundleName, moduleName, abilityName);
272 }
273 }
274
275 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)276 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
277 {
278 /* Run your code on data */
279 if (data == nullptr) {
280 return 0;
281 }
282
283 if (size < OHOS::U32_AT_SIZE) {
284 return 0;
285 }
286
287 char* ch = static_cast<char*>(malloc(size + 1));
288 if (ch == nullptr) {
289 return 0;
290 }
291
292 (void)memset_s(ch, size + 1, 0x00, size + 1);
293 if (memcpy_s(ch, size + 1, data, size) != EOK) {
294 free(ch);
295 ch = nullptr;
296 return 0;
297 }
298
299 OHOS::DoSomethingInterestingWithMyAPI(ch, size);
300 free(ch);
301 ch = nullptr;
302 return 0;
303 }
304
305