1/* 2 * Copyright (c) 2024 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#define private public 16#define protected public 17#include "ime_system_channel.h" 18#include "input_method_system_ability_proxy.h" 19#undef private 20 21#include "imesystemchannel_fuzzer.h" 22#include "system_cmd_channel_stub.h" 23#include <cstddef> 24#include <cstdint> 25 26#include "input_method_agent_stub.h" 27#include "message_parcel.h" 28 29using namespace OHOS::MiscServices; 30namespace OHOS { 31constexpr size_t THRESHOLD = 10; 32constexpr int32_t PRIVATEDATAVALUE = 100; 33void FuzzGetSmartMenuCfg() 34{ 35 ImeSystemCmdChannel::GetInstance()->GetSmartMenuCfg(); 36} 37 38void FuzzConnectSystemCmd() 39{ 40 sptr<OnSystemCmdListener> listener = new (std::nothrow) OnSystemCmdListener(); 41 if (listener == nullptr) { 42 return; 43 } 44 45 ImeSystemCmdChannel::GetInstance()->SetSystemCmdListener(listener); 46 ImeSystemCmdChannel::GetInstance()->GetSystemCmdListener(); 47 ImeSystemCmdChannel::GetInstance()->ConnectSystemCmd(listener); 48 ImeSystemCmdChannel::GetInstance()->RunConnectSystemCmd(); 49} 50 51void FuzzSystemCmdAgent() 52{ 53 ImeSystemCmdChannel::GetInstance()->GetSystemCmdAgent(); 54 ImeSystemCmdChannel::GetInstance()->ClearSystemCmdAgent(); 55} 56 57void FuzzOnSystemCmdAgent() 58{ 59 sptr<SystemCmdChannelStub> stub = new SystemCmdChannelStub(); 60 61 MessageParcel data; 62 data.WriteRemoteObject(stub->AsObject()); 63 sptr<IRemoteObject> remoteObject = data.ReadRemoteObject(); 64 ImeSystemCmdChannel::GetInstance()->OnConnectCmdReady(remoteObject); 65 ImeSystemCmdChannel::GetInstance()->OnSystemCmdAgentDied(remoteObject); 66} 67 68void FuzzPrivateCommand(const uint8_t *data, size_t size) 69{ 70 bool fuzzedBool = static_cast<bool>(data[0] % 2); 71 72 std::unordered_map<std::string, PrivateDataValue> privateCommand; 73 PrivateDataValue privateDataValue1 = std::string("stringValue"); 74 PrivateDataValue privateDataValue2 = fuzzedBool; 75 PrivateDataValue privateDataValue3 = PRIVATEDATAVALUE; 76 privateCommand.emplace("value1", privateDataValue1); 77 privateCommand.emplace("value2", privateDataValue2); 78 privateCommand.emplace("value3", privateDataValue3); 79 80 ImeSystemCmdChannel::GetInstance()->SendPrivateCommand(privateCommand); 81 ImeSystemCmdChannel::GetInstance()->ReceivePrivateCommand(privateCommand); 82} 83 84void FuzzNotifyPanelStatus(const uint8_t *data, size_t size) 85{ 86 InputType fuzzedBool = static_cast<InputType>(data[0] % 2); 87 auto fuzzedUint32 = static_cast<uint32_t>(size); 88 89 SysPanelStatus sysPanelStatus = { fuzzedBool, 0, fuzzedUint32, fuzzedUint32 }; 90 ImeSystemCmdChannel::GetInstance()->NotifyPanelStatus(sysPanelStatus); 91} 92} // namespace OHOS 93 94/* Fuzzer entry point */ 95extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 96{ 97 if (size < OHOS::THRESHOLD) { 98 return 0; 99 } 100 /* Run your code on data */ 101 102 OHOS::FuzzGetSmartMenuCfg(); 103 OHOS::FuzzConnectSystemCmd(); 104 OHOS::FuzzSystemCmdAgent(); 105 OHOS::FuzzOnSystemCmdAgent(); 106 OHOS::FuzzPrivateCommand(data, size); 107 OHOS::FuzzNotifyPanelStatus(data, size); 108 return 0; 109}