• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "formcachemgr_fuzzer.h"
17 
18 #include <cstddef>
19 #include <cstdint>
20 
21 #define private public
22 #define protected public
23 #include "data_center/form_cache_mgr.h"
24 #include "common/event/form_event_handler.h"
25 #include "common/util/form_serial_queue.h"
26 #undef private
27 #undef protected
28 #include "securec.h"
29 
30 using namespace OHOS::AppExecFwk;
31 
32 namespace OHOS {
33 constexpr size_t U32_AT_SIZE = 4;
34 constexpr int64_t EVENT_MSG = 1;
35 constexpr int64_t EVENT_ID = 2;
GetU32Data(const char * ptr)36 uint32_t GetU32Data(const char* ptr)
37 {
38     // convert fuzz input data to an integer
39     return (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
40 }
DoSomethingInterestingWithMyAPI(const char * data,size_t size)41 bool DoSomethingInterestingWithMyAPI(const char* data, size_t size)
42 {
43     FormCacheMgr formCacheMgr;
44     int64_t formId = static_cast<int64_t>(GetU32Data(data));
45     std::string datas(data, size);
46     std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
47     formCacheMgr.GetData(formId, datas, imageDataMap);
48 
49     FormProviderData formProviderData;
50     formProviderData.SetDataString(datas);
51     formCacheMgr.AddData(formId, formProviderData);
52 
53     formCacheMgr.DeleteData(formId);
54     FormEventHandler formEventHandler(nullptr);
55     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get();
56     formEventHandler.ProcessEvent(EVENT_MSG, EVENT_ID);
57     formEventHandler.GetEventId();
58     std::shared_ptr<FormEventTimeoutObserver> observer = nullptr;
59     formEventHandler.RegisterEventTimeoutObserver(observer);
60     formEventHandler.UnregisterEventTimeoutObserver(observer);
61     return formCacheMgr.NeedAcquireProviderData(formId);
62 }
63 
DoSomethingInterestingWithMyAPI1(const char * data,size_t size)64 bool DoSomethingInterestingWithMyAPI1(const char* data, size_t size)
65 {
66     FormCacheMgr formCacheMgr;
67     int64_t formId = static_cast<int64_t>(GetU32Data(data));
68     std::string datas(data, size);
69     std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
70     formCacheMgr.GetData(formId, datas, imageDataMap);
71 
72     FormProviderData formProviderData;
73     formProviderData.SetDataString(datas);
74     formCacheMgr.AddData(formId, formProviderData);
75 
76     formCacheMgr.DeleteData(formId);
77     FormEventHandler formEventHandler(nullptr);
78     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get();
79     formEventHandler.ProcessEvent(EVENT_MSG, EVENT_ID);
80     formEventHandler.GetEventId();
81     std::shared_ptr<FormEventTimeoutObserver> observer = nullptr;
82     formEventHandler.RegisterEventTimeoutObserver(observer);
83     formEventHandler.UnregisterEventTimeoutObserver(observer);
84     return formCacheMgr.NeedAcquireProviderData(formId);
85 }
86 
DoSomethingInterestingWithMyAPI2(const char * data,size_t size)87 bool DoSomethingInterestingWithMyAPI2(const char* data, size_t size)
88 {
89     FormCacheMgr formCacheMgr;
90     int64_t formId = static_cast<int64_t>(GetU32Data(data));
91     std::string datas(data, size);
92     std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
93     formCacheMgr.GetData(formId, datas, imageDataMap);
94 
95     FormProviderData formProviderData;
96     formProviderData.SetDataString(datas);
97     formCacheMgr.AddData(formId, formProviderData);
98 
99     formCacheMgr.DeleteData(formId);
100     FormEventHandler formEventHandler(nullptr);
101     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get();
102     formEventHandler.ProcessEvent(EVENT_MSG, EVENT_ID);
103     formEventHandler.GetEventId();
104     std::shared_ptr<FormEventTimeoutObserver> observer = nullptr;
105     formEventHandler.RegisterEventTimeoutObserver(observer);
106     formEventHandler.UnregisterEventTimeoutObserver(observer);
107     return formCacheMgr.NeedAcquireProviderData(formId);
108 }
109 
DoSomethingInterestingWithMyAPI3(const char * data,size_t size)110 bool DoSomethingInterestingWithMyAPI3(const char* data, size_t size)
111 {
112     FormCacheMgr formCacheMgr;
113     int64_t formId = static_cast<int64_t>(GetU32Data(data));
114     std::string datas(data, size);
115     std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
116     formCacheMgr.GetData(formId, datas, imageDataMap);
117 
118     FormProviderData formProviderData;
119     formProviderData.SetDataString(datas);
120     formCacheMgr.AddData(formId, formProviderData);
121 
122     formCacheMgr.DeleteData(formId);
123     FormEventHandler formEventHandler(nullptr);
124     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get();
125     formEventHandler.ProcessEvent(EVENT_MSG, EVENT_ID);
126     formEventHandler.GetEventId();
127     std::shared_ptr<FormEventTimeoutObserver> observer = nullptr;
128     formEventHandler.RegisterEventTimeoutObserver(observer);
129     formEventHandler.UnregisterEventTimeoutObserver(observer);
130     return formCacheMgr.NeedAcquireProviderData(formId);
131 }
132 
DoSomethingInterestingWithMyAPI4(const char * data,size_t size)133 bool DoSomethingInterestingWithMyAPI4(const char* data, size_t size)
134 {
135     FormCacheMgr formCacheMgr;
136     int64_t formId = static_cast<int64_t>(GetU32Data(data));
137     std::string datas(data, size);
138     std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
139     formCacheMgr.GetData(formId, datas, imageDataMap);
140 
141     FormProviderData formProviderData;
142     formProviderData.SetDataString(datas);
143     formCacheMgr.AddData(formId, formProviderData);
144 
145     formCacheMgr.DeleteData(formId);
146     FormEventHandler formEventHandler(nullptr);
147     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get();
148     formEventHandler.ProcessEvent(EVENT_MSG, EVENT_ID);
149     formEventHandler.GetEventId();
150     std::shared_ptr<FormEventTimeoutObserver> observer = nullptr;
151     formEventHandler.RegisterEventTimeoutObserver(observer);
152     formEventHandler.UnregisterEventTimeoutObserver(observer);
153     return formCacheMgr.NeedAcquireProviderData(formId);
154 }
155 
DoSomethingInterestingWithMyAPI5(const char * data,size_t size)156 bool DoSomethingInterestingWithMyAPI5(const char* data, size_t size)
157 {
158     FormCacheMgr formCacheMgr;
159     int64_t formId = static_cast<int64_t>(GetU32Data(data));
160     std::string datas(data, size);
161     std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
162     formCacheMgr.GetData(formId, datas, imageDataMap);
163 
164     FormProviderData formProviderData;
165     formProviderData.SetDataString(datas);
166     formCacheMgr.AddData(formId, formProviderData);
167 
168     formCacheMgr.DeleteData(formId);
169     FormEventHandler formEventHandler(nullptr);
170     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get();
171     formEventHandler.ProcessEvent(EVENT_MSG, EVENT_ID);
172     formEventHandler.GetEventId();
173     std::shared_ptr<FormEventTimeoutObserver> observer = nullptr;
174     formEventHandler.RegisterEventTimeoutObserver(observer);
175     formEventHandler.UnregisterEventTimeoutObserver(observer);
176     return formCacheMgr.NeedAcquireProviderData(formId);
177 }
178 
DoSomethingInterestingWithMyAPI6(const char * data,size_t size)179 bool DoSomethingInterestingWithMyAPI6(const char* data, size_t size)
180 {
181     FormCacheMgr formCacheMgr;
182     int64_t formId = static_cast<int64_t>(GetU32Data(data));
183     std::string datas(data, size);
184     std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
185     formCacheMgr.GetData(formId, datas, imageDataMap);
186 
187     FormProviderData formProviderData;
188     formProviderData.SetDataString(datas);
189     formCacheMgr.AddData(formId, formProviderData);
190 
191     formCacheMgr.DeleteData(formId);
192     FormEventHandler formEventHandler(nullptr);
193     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get();
194     formEventHandler.ProcessEvent(EVENT_MSG, EVENT_ID);
195     formEventHandler.GetEventId();
196     std::shared_ptr<FormEventTimeoutObserver> observer = nullptr;
197     formEventHandler.RegisterEventTimeoutObserver(observer);
198     formEventHandler.UnregisterEventTimeoutObserver(observer);
199     return formCacheMgr.NeedAcquireProviderData(formId);
200 }
201 
DoSomethingInterestingWithMyAPI7(const char * data,size_t size)202 bool DoSomethingInterestingWithMyAPI7(const char* data, size_t size)
203 {
204     FormCacheMgr formCacheMgr;
205     int64_t formId = static_cast<int64_t>(GetU32Data(data));
206     std::string datas(data, size);
207     std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
208     formCacheMgr.GetData(formId, datas, imageDataMap);
209 
210     FormProviderData formProviderData;
211     formProviderData.SetDataString(datas);
212     formCacheMgr.AddData(formId, formProviderData);
213 
214     formCacheMgr.DeleteData(formId);
215     FormEventHandler formEventHandler(nullptr);
216     AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get();
217     formEventHandler.ProcessEvent(EVENT_MSG, EVENT_ID);
218     formEventHandler.GetEventId();
219     std::shared_ptr<FormEventTimeoutObserver> observer = nullptr;
220     formEventHandler.RegisterEventTimeoutObserver(observer);
221     formEventHandler.UnregisterEventTimeoutObserver(observer);
222     return formCacheMgr.NeedAcquireProviderData(formId);
223 }
224 }
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     /* Run your code on data */
230     if (data == nullptr) {
231         return 0;
232     }
233 
234     if (size < OHOS::U32_AT_SIZE) {
235         return 0;
236     }
237 
238     char* ch = static_cast<char*>(malloc(size + 1));
239     if (ch == nullptr) {
240         return 0;
241     }
242 
243     (void)memset_s(ch, size + 1, 0x00, size + 1);
244     if (memcpy_s(ch, size + 1, data, size) != EOK) {
245         free(ch);
246         ch = nullptr;
247         return 0;
248     }
249 
250     OHOS::DoSomethingInterestingWithMyAPI(ch, size);
251     free(ch);
252     ch = nullptr;
253     return 0;
254 }
255 
256