1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "securec.h" 17094332d3Sopenharmony_ci#include <cstdint> 18094332d3Sopenharmony_ci#include <cstdlib> 19094332d3Sopenharmony_ci#include <memory> 20094332d3Sopenharmony_ci 21094332d3Sopenharmony_ci#include "power_interface_impl.h" 22094332d3Sopenharmony_ci#include "v1_2/ipower_interface.h" 23094332d3Sopenharmony_ci#include "v1_2/power_interface_stub.h" 24094332d3Sopenharmony_ci#include "v1_2/power_types.h" 25094332d3Sopenharmony_ci 26094332d3Sopenharmony_ciusing namespace OHOS::HDI; 27094332d3Sopenharmony_ciusing namespace OHOS::HDI::Power::V1_2; 28094332d3Sopenharmony_ciusing namespace std; 29094332d3Sopenharmony_ci 30094332d3Sopenharmony_cinamespace OHOS { 31094332d3Sopenharmony_cinamespace HDI { 32094332d3Sopenharmony_cinamespace Power { 33094332d3Sopenharmony_cinamespace V1_2 { 34094332d3Sopenharmony_ciclass PowerFuzzTest { 35094332d3Sopenharmony_cipublic: 36094332d3Sopenharmony_ci PowerFuzzTest() 37094332d3Sopenharmony_ci { 38094332d3Sopenharmony_ci impl_ = new PowerInterfaceImpl(); 39094332d3Sopenharmony_ci impl_->SuspendBlock("PowerStubFuzzTest"); // Prevent device sleep 40094332d3Sopenharmony_ci } 41094332d3Sopenharmony_ci ~PowerFuzzTest() 42094332d3Sopenharmony_ci { 43094332d3Sopenharmony_ci impl_->SuspendUnblock("PowerStubFuzzTest"); 44094332d3Sopenharmony_ci } 45094332d3Sopenharmony_ci sptr<PowerInterfaceImpl> GetImpl() const 46094332d3Sopenharmony_ci { 47094332d3Sopenharmony_ci return impl_; 48094332d3Sopenharmony_ci } 49094332d3Sopenharmony_ci 50094332d3Sopenharmony_ciprivate: 51094332d3Sopenharmony_ci sptr<PowerInterfaceImpl> impl_ = nullptr; 52094332d3Sopenharmony_ci}; 53094332d3Sopenharmony_cinamespace { 54094332d3Sopenharmony_ciconst int32_t REWIND_READ_DATA = 0; 55094332d3Sopenharmony_cishared_ptr<PowerInterfaceStub> g_fuzzService = nullptr; 56094332d3Sopenharmony_cishared_ptr<PowerFuzzTest> g_fuzzTest = nullptr; 57094332d3Sopenharmony_ciconst uint32_t POWER_INTERFACE_STUB_FUNC_MAX_SIZE = 15; 58094332d3Sopenharmony_ci} // namespace 59094332d3Sopenharmony_ci 60094332d3Sopenharmony_cistatic void PowerStubFuzzTest(const uint8_t *data, size_t size) 61094332d3Sopenharmony_ci{ 62094332d3Sopenharmony_ci uint32_t code; 63094332d3Sopenharmony_ci if (size < sizeof(code)) { 64094332d3Sopenharmony_ci return; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci if (memcpy_s(&code, sizeof(code), data, sizeof(code)) != EOK) { 67094332d3Sopenharmony_ci return; 68094332d3Sopenharmony_ci } 69094332d3Sopenharmony_ci 70094332d3Sopenharmony_ci MessageParcel datas; 71094332d3Sopenharmony_ci MessageParcel reply; 72094332d3Sopenharmony_ci MessageOption option; 73094332d3Sopenharmony_ci if (g_fuzzService == nullptr) { 74094332d3Sopenharmony_ci g_fuzzTest = make_shared<PowerFuzzTest>(); 75094332d3Sopenharmony_ci g_fuzzService = make_shared<PowerInterfaceStub>(g_fuzzTest->GetImpl()); 76094332d3Sopenharmony_ci } 77094332d3Sopenharmony_ci for (code = CMD_POWER_INTERFACE_GET_VERSION; code < POWER_INTERFACE_STUB_FUNC_MAX_SIZE; code++) { 78094332d3Sopenharmony_ci // Filter force sleep calls 79094332d3Sopenharmony_ci if (CMD_POWER_INTERFACE_FORCE_SUSPEND == code) { 80094332d3Sopenharmony_ci continue; 81094332d3Sopenharmony_ci } 82094332d3Sopenharmony_ci datas.WriteInterfaceToken(IPowerInterface::GetDescriptor()); 83094332d3Sopenharmony_ci datas.WriteBuffer(data, size); 84094332d3Sopenharmony_ci datas.RewindRead(REWIND_READ_DATA); 85094332d3Sopenharmony_ci g_fuzzService->OnRemoteRequest(code, datas, reply, option); 86094332d3Sopenharmony_ci } 87094332d3Sopenharmony_ci} 88094332d3Sopenharmony_ci} // namespace V1_2 89094332d3Sopenharmony_ci} // namespace Power 90094332d3Sopenharmony_ci} // namespace HDI 91094332d3Sopenharmony_ci} // namespace OHOS 92094332d3Sopenharmony_ci 93094332d3Sopenharmony_ci/* Fuzzer entry point */ 94094332d3Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 95094332d3Sopenharmony_ci{ 96094332d3Sopenharmony_ci /* Run your code on data */ 97094332d3Sopenharmony_ci OHOS::HDI::Power::V1_2::PowerStubFuzzTest(data, size); 98094332d3Sopenharmony_ci return 0; 99094332d3Sopenharmony_ci} 100