1 /*
2 * Copyright (c) 2023 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 "event_queue.h"
17 #include "event_queue_base.h"
18 #include "eventqueueannex_fuzzer.h"
19 #include "securec.h"
20
21 namespace OHOS {
22 namespace {
23 constexpr size_t U32_AT_SIZE = 4;
24 }
25
26 class MyFileDescriptorListener : public AppExecFwk::FileDescriptorListener {
27 public:
MyFileDescriptorListener()28 MyFileDescriptorListener()
29 {}
~MyFileDescriptorListener()30 ~MyFileDescriptorListener()
31 {}
32
33 /* @param int32_t fileDescriptor */
OnReadable(int32_t)34 void OnReadable(int32_t)
35 {}
36
37 /* @param int32_t fileDescriptor */
OnWritable(int32_t)38 void OnWritable(int32_t)
39 {}
40
41 /* @param int32_t fileDescriptor */
OnException(int32_t)42 void OnException(int32_t)
43 {}
44
45 MyFileDescriptorListener(const MyFileDescriptorListener &) = delete;
46 MyFileDescriptorListener &operator=(const MyFileDescriptorListener &) = delete;
47 MyFileDescriptorListener(MyFileDescriptorListener &&) = delete;
48 MyFileDescriptorListener &operator=(MyFileDescriptorListener &&) = delete;
49 };
50
DoSomethingInterestingWithMyAPI(const char * data,size_t size)51 bool DoSomethingInterestingWithMyAPI(const char* data, size_t size)
52 {
53 std::string stringData(data);
54 std::shared_ptr<AppExecFwk::IoWaiter> ioWaiter = nullptr;
55 AppExecFwk::EventQueueBase eventQueue(ioWaiter);
56 std::shared_ptr<AppExecFwk::EventHandler> myHandler;
57 uint32_t innerEventId = *data;
58 int64_t param = U32_AT(reinterpret_cast<const uint8_t*>(data));
59 eventQueue.HasInnerEvent(myHandler, innerEventId);
60 eventQueue.Remove(myHandler);
61 eventQueue.Remove(myHandler, innerEventId);
62 eventQueue.Remove(myHandler, innerEventId, param);
63 eventQueue.Remove(myHandler, stringData);
64 int32_t fileDescriptor = U32_AT(reinterpret_cast<const uint8_t*>(data));
65 auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
66 eventQueue.AddFileDescriptorListener(fileDescriptor, innerEventId, fileDescriptorListener,
67 "DoSomethingInterestingWithMyAPI");
68 eventQueue.RemoveFileDescriptorListener(myHandler);
69 eventQueue.RemoveFileDescriptorListener(fileDescriptor);
70 eventQueue.RemoveOrphan();
71 eventQueue.GetEvent();
72 eventQueue.IsIdle();
73 eventQueue.Prepare();
74 eventQueue.Finish();
75 return true;
76 }
77 }
78
79 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)80 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
81 {
82 /* Run your code on data */
83 if (data == nullptr) {
84 return 0;
85 }
86
87 if (size < OHOS::U32_AT_SIZE) {
88 return 0;
89 }
90
91 char* ch = (char *)malloc(size + 1);
92 if (ch == nullptr) {
93 return 0;
94 }
95
96 (void)memset_s(ch, size + 1, 0x00, size + 1);
97 if (memcpy_s(ch, size, data, size) != EOK) {
98 free(ch);
99 ch = nullptr;
100 return 0;
101 }
102
103 OHOS::DoSomethingInterestingWithMyAPI(ch, size);
104 free(ch);
105 ch = nullptr;
106 return 0;
107 }
108