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 "effectmodel_fuzzer.h" 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_ci#include <cstdlib> 19094332d3Sopenharmony_ci#include "v1_0/effect_types.h" 20094332d3Sopenharmony_ci#include "v1_0/ieffect_control.h" 21094332d3Sopenharmony_ci#include "v1_0/ieffect_model.h" 22094332d3Sopenharmony_ci 23094332d3Sopenharmony_ciusing namespace std; 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_cinamespace OHOS { 26094332d3Sopenharmony_cinamespace Audio { 27094332d3Sopenharmony_ciconstexpr int32_t OFFSET = 4; 28094332d3Sopenharmony_ciconstexpr size_t THRESHOLD = 10; 29094332d3Sopenharmony_ciconstexpr uint32_t MAX_DESCRIPTOR_NUM = 20; 30094332d3Sopenharmony_ci 31094332d3Sopenharmony_cienum EffectModelCmdId { 32094332d3Sopenharmony_ci EFFECT_MODEL_IS_SUPPLY_LIBS, 33094332d3Sopenharmony_ci EFFECT_MODEL_GET_ALL_DESCRIPTORS, 34094332d3Sopenharmony_ci EFFECT_MODEL_CREATE_EFFECT_CONTROLLER, 35094332d3Sopenharmony_ci EFFECT_MODEL_DESTROY_EFFECT_CONTROLLER, 36094332d3Sopenharmony_ci EFFECT_MODEL_GET_EFFECT_DESCRIPTOR, 37094332d3Sopenharmony_ci}; 38094332d3Sopenharmony_ci 39094332d3Sopenharmony_cistatic uint32_t Convert2Uint32(const uint8_t *ptr) 40094332d3Sopenharmony_ci{ 41094332d3Sopenharmony_ci if (ptr == nullptr) { 42094332d3Sopenharmony_ci return 0; 43094332d3Sopenharmony_ci } 44094332d3Sopenharmony_ci /* 45094332d3Sopenharmony_ci * Move the 0th digit 24 to the left, the first digit 16 to the left, the second digit 8 to the left, 46094332d3Sopenharmony_ci * and the third digit no left 47094332d3Sopenharmony_ci */ 48094332d3Sopenharmony_ci return (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]); 49094332d3Sopenharmony_ci} 50094332d3Sopenharmony_ci 51094332d3Sopenharmony_civoid EffectModelFucSwitch(struct IEffectModel *&model, uint32_t cmd, const uint8_t *&rawData, size_t size) 52094332d3Sopenharmony_ci{ 53094332d3Sopenharmony_ci uint8_t *data = const_cast<uint8_t *>(rawData); 54094332d3Sopenharmony_ci switch (cmd) { 55094332d3Sopenharmony_ci case EFFECT_MODEL_IS_SUPPLY_LIBS: { 56094332d3Sopenharmony_ci bool isSupport = false; 57094332d3Sopenharmony_ci model->IsSupplyEffectLibs(model, &isSupport); 58094332d3Sopenharmony_ci break; 59094332d3Sopenharmony_ci } 60094332d3Sopenharmony_ci case EFFECT_MODEL_GET_ALL_DESCRIPTORS: { 61094332d3Sopenharmony_ci uint32_t descsLen = MAX_DESCRIPTOR_NUM; 62094332d3Sopenharmony_ci struct EffectControllerDescriptor descs[MAX_DESCRIPTOR_NUM]; 63094332d3Sopenharmony_ci model->GetAllEffectDescriptors(model, descs, &descsLen); 64094332d3Sopenharmony_ci break; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci case EFFECT_MODEL_CREATE_EFFECT_CONTROLLER: { 67094332d3Sopenharmony_ci struct IEffectControl *contoller = nullptr; 68094332d3Sopenharmony_ci struct ControllerId contollerId; 69094332d3Sopenharmony_ci struct EffectInfo info = { 70094332d3Sopenharmony_ci .libName = reinterpret_cast<char *>(data), 71094332d3Sopenharmony_ci .effectId = reinterpret_cast<char *>(data), 72094332d3Sopenharmony_ci .ioDirection = 1, 73094332d3Sopenharmony_ci }; 74094332d3Sopenharmony_ci model->CreateEffectController(model, &info, &contoller, &contollerId); 75094332d3Sopenharmony_ci break; 76094332d3Sopenharmony_ci } 77094332d3Sopenharmony_ci case EFFECT_MODEL_DESTROY_EFFECT_CONTROLLER: { 78094332d3Sopenharmony_ci struct ControllerId contollerId{ 79094332d3Sopenharmony_ci .libName = reinterpret_cast<char *>(data), 80094332d3Sopenharmony_ci .effectId = reinterpret_cast<char *>(data), 81094332d3Sopenharmony_ci }; 82094332d3Sopenharmony_ci model->DestroyEffectController(model, &contollerId); 83094332d3Sopenharmony_ci break; 84094332d3Sopenharmony_ci } 85094332d3Sopenharmony_ci case EFFECT_MODEL_GET_EFFECT_DESCRIPTOR: { 86094332d3Sopenharmony_ci struct EffectControllerDescriptor desc; 87094332d3Sopenharmony_ci model->GetEffectDescriptor(model, reinterpret_cast<const char *>(data), &desc); 88094332d3Sopenharmony_ci break; 89094332d3Sopenharmony_ci } 90094332d3Sopenharmony_ci default: 91094332d3Sopenharmony_ci return; 92094332d3Sopenharmony_ci } 93094332d3Sopenharmony_ci} 94094332d3Sopenharmony_ci 95094332d3Sopenharmony_cibool DoSomethingInterestingWithMyAPI(const uint8_t *rawData, size_t size) 96094332d3Sopenharmony_ci{ 97094332d3Sopenharmony_ci if (rawData == nullptr) { 98094332d3Sopenharmony_ci return false; 99094332d3Sopenharmony_ci } 100094332d3Sopenharmony_ci uint32_t cmd = Convert2Uint32(rawData) % EFFECT_MODEL_GET_EFFECT_DESCRIPTOR; 101094332d3Sopenharmony_ci rawData = rawData + OFFSET; 102094332d3Sopenharmony_ci 103094332d3Sopenharmony_ci struct IEffectModel *model = IEffectModelGet(true); 104094332d3Sopenharmony_ci if (model == nullptr) { 105094332d3Sopenharmony_ci return false; 106094332d3Sopenharmony_ci } 107094332d3Sopenharmony_ci 108094332d3Sopenharmony_ci EffectModelFucSwitch(model, cmd, rawData, size); 109094332d3Sopenharmony_ci 110094332d3Sopenharmony_ci if (model != nullptr) { 111094332d3Sopenharmony_ci IEffectModelRelease(model, true); 112094332d3Sopenharmony_ci } 113094332d3Sopenharmony_ci return true; 114094332d3Sopenharmony_ci} 115094332d3Sopenharmony_ci} 116094332d3Sopenharmony_ci} 117094332d3Sopenharmony_ci 118094332d3Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 119094332d3Sopenharmony_ci{ 120094332d3Sopenharmony_ci if (size < OHOS::Audio::THRESHOLD) { 121094332d3Sopenharmony_ci return 0; 122094332d3Sopenharmony_ci } 123094332d3Sopenharmony_ci 124094332d3Sopenharmony_ci if(data == nullptr) { 125094332d3Sopenharmony_ci return 0; 126094332d3Sopenharmony_ci } 127094332d3Sopenharmony_ci 128094332d3Sopenharmony_ci for (int i = 0; i < size - 1; i++) { 129094332d3Sopenharmony_ci if (data[i] == '\0') { 130094332d3Sopenharmony_ci return 0; 131094332d3Sopenharmony_ci } 132094332d3Sopenharmony_ci } 133094332d3Sopenharmony_ci 134094332d3Sopenharmony_ci if (data[size -1] != '\0') { 135094332d3Sopenharmony_ci return 0; 136094332d3Sopenharmony_ci } 137094332d3Sopenharmony_ci OHOS::Audio::DoSomethingInterestingWithMyAPI(data, size); 138094332d3Sopenharmony_ci return 0; 139094332d3Sopenharmony_ci}