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 21namespace OHOS { 22namespace { 23 constexpr size_t U32_AT_SIZE = 4; 24} 25 26class MyFileDescriptorListener : public AppExecFwk::FileDescriptorListener { 27public: 28 MyFileDescriptorListener() 29 {} 30 ~MyFileDescriptorListener() 31 {} 32 33 /* @param int32_t fileDescriptor */ 34 void OnReadable(int32_t) 35 {} 36 37 /* @param int32_t fileDescriptor */ 38 void OnWritable(int32_t) 39 {} 40 41 /* @param int32_t fileDescriptor */ 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 51bool 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 */ 80extern "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