1bc03f14fSopenharmony_ci/* 2bc03f14fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3bc03f14fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4bc03f14fSopenharmony_ci * you may not use this file except in compliance with the License. 5bc03f14fSopenharmony_ci * You may obtain a copy of the License at 6bc03f14fSopenharmony_ci * 7bc03f14fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8bc03f14fSopenharmony_ci * 9bc03f14fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10bc03f14fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11bc03f14fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12bc03f14fSopenharmony_ci * See the License for the specific language governing permissions and 13bc03f14fSopenharmony_ci * limitations under the License. 14bc03f14fSopenharmony_ci */ 15bc03f14fSopenharmony_ci 16bc03f14fSopenharmony_ci#include "pasteboardobserver_fuzzer.h" 17bc03f14fSopenharmony_ci 18bc03f14fSopenharmony_ci#include "message_parcel.h" 19bc03f14fSopenharmony_ci 20bc03f14fSopenharmony_ci#include <map> 21bc03f14fSopenharmony_ci 22bc03f14fSopenharmony_ci#include "pasteboard_error.h" 23bc03f14fSopenharmony_ci#include "pasteboard_observer.h" 24bc03f14fSopenharmony_ci#include "pasteboard_serv_ipc_interface_code.h" 25bc03f14fSopenharmony_ci 26bc03f14fSopenharmony_cinamespace OHOS { 27bc03f14fSopenharmony_ciusing namespace OHOS::Security::PasteboardServ; 28bc03f14fSopenharmony_ciusing namespace OHOS::MiscServices; 29bc03f14fSopenharmony_ciconstexpr size_t THRESHOLD = 2; 30bc03f14fSopenharmony_ciconst std::u16string PASTEBOARDSERVICE_INTERFACE_TOKEN = u"ohos.miscservices.pasteboard.IPasteboardService"; 31bc03f14fSopenharmony_ci 32bc03f14fSopenharmony_citemplate<class T> 33bc03f14fSopenharmony_ciT TypeCast(const uint8_t *data, int *pos = nullptr) 34bc03f14fSopenharmony_ci{ 35bc03f14fSopenharmony_ci if (pos) { 36bc03f14fSopenharmony_ci *pos += sizeof(T); 37bc03f14fSopenharmony_ci } 38bc03f14fSopenharmony_ci return *(reinterpret_cast<const T*>(data)); 39bc03f14fSopenharmony_ci} 40bc03f14fSopenharmony_ci 41bc03f14fSopenharmony_cibool FuzzPasteboardObserver(const uint8_t *rawData, size_t size) 42bc03f14fSopenharmony_ci{ 43bc03f14fSopenharmony_ci if (rawData == nullptr || size < sizeof(uint32_t)) { 44bc03f14fSopenharmony_ci return true; 45bc03f14fSopenharmony_ci } 46bc03f14fSopenharmony_ci uint32_t code = TypeCast<uint32_t>(rawData); 47bc03f14fSopenharmony_ci MessageParcel data; 48bc03f14fSopenharmony_ci data.WriteInterfaceToken(PASTEBOARDSERVICE_INTERFACE_TOKEN); 49bc03f14fSopenharmony_ci MessageParcel reply; 50bc03f14fSopenharmony_ci MessageOption option; 51bc03f14fSopenharmony_ci std::make_shared<PasteboardObserver>()->OnRemoteRequest( 52bc03f14fSopenharmony_ci static_cast<uint32_t>(code % THRESHOLD), data, reply, option); 53bc03f14fSopenharmony_ci return true; 54bc03f14fSopenharmony_ci} 55bc03f14fSopenharmony_ci 56bc03f14fSopenharmony_cibool FuzzPasteboardObserverOnPasteboardChangedStub(const uint8_t *rawData, size_t size) 57bc03f14fSopenharmony_ci{ 58bc03f14fSopenharmony_ci MessageParcel data; 59bc03f14fSopenharmony_ci data.WriteInterfaceToken(PasteboardObserverStub::GetDescriptor()); 60bc03f14fSopenharmony_ci MessageParcel reply; 61bc03f14fSopenharmony_ci MessageOption option; 62bc03f14fSopenharmony_ci std::make_shared<PasteboardObserver>()->OnRemoteRequest( 63bc03f14fSopenharmony_ci static_cast<uint32_t>(PasteboardObserverInterfaceCode::ON_PASTE_BOARD_CHANGE), data, reply, option); 64bc03f14fSopenharmony_ci return true; 65bc03f14fSopenharmony_ci} 66bc03f14fSopenharmony_ci 67bc03f14fSopenharmony_cibool FuzzPasteboardObserverOnPasteboardEventStub(const uint8_t *rawData, size_t size) 68bc03f14fSopenharmony_ci{ 69bc03f14fSopenharmony_ci if (rawData == nullptr || size < sizeof(int32_t)) { 70bc03f14fSopenharmony_ci return true; 71bc03f14fSopenharmony_ci } 72bc03f14fSopenharmony_ci 73bc03f14fSopenharmony_ci MessageParcel data; 74bc03f14fSopenharmony_ci data.WriteInterfaceToken(PasteboardObserverStub::GetDescriptor()); 75bc03f14fSopenharmony_ci MessageParcel reply; 76bc03f14fSopenharmony_ci MessageOption option; 77bc03f14fSopenharmony_ci int pos = 0; 78bc03f14fSopenharmony_ci int32_t status = TypeCast<int32_t>(rawData, &pos); 79bc03f14fSopenharmony_ci data.WriteString(std::string(reinterpret_cast<const char*>(rawData + pos), size - pos)); 80bc03f14fSopenharmony_ci data.WriteInt32(status); 81bc03f14fSopenharmony_ci std::make_shared<PasteboardObserver>()->OnRemoteRequest( 82bc03f14fSopenharmony_ci static_cast<uint32_t>(PasteboardObserverInterfaceCode::ON_PASTE_BOARD_EVENT), data, reply, option); 83bc03f14fSopenharmony_ci return true; 84bc03f14fSopenharmony_ci} 85bc03f14fSopenharmony_ci} // namespace OHOS 86bc03f14fSopenharmony_ci/* Fuzzer entry point */ 87bc03f14fSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 88bc03f14fSopenharmony_ci{ 89bc03f14fSopenharmony_ci /* Run your code on data */ 90bc03f14fSopenharmony_ci OHOS::FuzzPasteboardObserver(data, size); 91bc03f14fSopenharmony_ci OHOS::FuzzPasteboardObserverOnPasteboardChangedStub(data, size); 92bc03f14fSopenharmony_ci OHOS::FuzzPasteboardObserverOnPasteboardEventStub(data, size); 93bc03f14fSopenharmony_ci return 0; 94bc03f14fSopenharmony_ci} 95