1eace7efcSopenharmony_ci/* 2eace7efcSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3eace7efcSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4eace7efcSopenharmony_ci * you may not use this file except in compliance with the License. 5eace7efcSopenharmony_ci * You may obtain a copy of the License at 6eace7efcSopenharmony_ci * 7eace7efcSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8eace7efcSopenharmony_ci * 9eace7efcSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10eace7efcSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11eace7efcSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12eace7efcSopenharmony_ci * See the License for the specific language governing permissions and 13eace7efcSopenharmony_ci * limitations under the License. 14eace7efcSopenharmony_ci */ 15eace7efcSopenharmony_ci 16eace7efcSopenharmony_ci#include "abilityautostartupdatamanagera_fuzzer.h" 17eace7efcSopenharmony_ci 18eace7efcSopenharmony_ci#include <cstddef> 19eace7efcSopenharmony_ci#include <cstdint> 20eace7efcSopenharmony_ci 21eace7efcSopenharmony_ci#define private public 22eace7efcSopenharmony_ci#define protected public 23eace7efcSopenharmony_ci#include "ability_auto_startup_data_manager.h" 24eace7efcSopenharmony_ci#undef protected 25eace7efcSopenharmony_ci#undef private 26eace7efcSopenharmony_ci 27eace7efcSopenharmony_ci#include "ability_record.h" 28eace7efcSopenharmony_ci 29eace7efcSopenharmony_ciusing namespace OHOS::AAFwk; 30eace7efcSopenharmony_ciusing namespace OHOS::AppExecFwk; 31eace7efcSopenharmony_ciusing namespace OHOS::AbilityRuntime; 32eace7efcSopenharmony_ci 33eace7efcSopenharmony_cinamespace OHOS { 34eace7efcSopenharmony_cinamespace { 35eace7efcSopenharmony_ciconstexpr int INPUT_ZERO = 0; 36eace7efcSopenharmony_ciconstexpr int INPUT_ONE = 1; 37eace7efcSopenharmony_ciconstexpr int INPUT_THREE = 3; 38eace7efcSopenharmony_ciconstexpr size_t FOO_MAX_LEN = 1024; 39eace7efcSopenharmony_ciconstexpr size_t U32_AT_SIZE = 4; 40eace7efcSopenharmony_ciconstexpr uint8_t ENABLE = 2; 41eace7efcSopenharmony_ciconstexpr size_t OFFSET_ZERO = 24; 42eace7efcSopenharmony_ciconstexpr size_t OFFSET_ONE = 16; 43eace7efcSopenharmony_ciconstexpr size_t OFFSET_TWO = 8; 44eace7efcSopenharmony_ciconst std::string jsonStr1 = "{\n\"isAutoStartup\": true, \n\"isEdmForce\": true\n}"; 45eace7efcSopenharmony_ciconst std::string jsonStr2 = "{\n\"isAutoStartup\": \"true\", \n\"isEdmForce\": \"true\"\n}"; 46eace7efcSopenharmony_ciconst std::string jsonStr3 = "{\n\"isAutoStartup2\": true, \n\"isEdmForce2\": true\n}"; 47eace7efcSopenharmony_ciconst std::string jsonStr4 = "{\n\"isAutoStartup2\": true, \n\"isEdmForce2\": true\n"; 48eace7efcSopenharmony_ci} 49eace7efcSopenharmony_ci 50eace7efcSopenharmony_ciuint32_t GetU32Data(const char* ptr) 51eace7efcSopenharmony_ci{ 52eace7efcSopenharmony_ci // convert fuzz input data to an integer 53eace7efcSopenharmony_ci return (ptr[INPUT_ZERO] << OFFSET_ZERO) | (ptr[INPUT_ONE] << OFFSET_ONE) | (ptr[ENABLE] << OFFSET_TWO) | 54eace7efcSopenharmony_ci ptr[INPUT_THREE]; 55eace7efcSopenharmony_ci} 56eace7efcSopenharmony_ci 57eace7efcSopenharmony_cisptr<Token> GetFuzzAbilityToken() 58eace7efcSopenharmony_ci{ 59eace7efcSopenharmony_ci sptr<Token> token = nullptr; 60eace7efcSopenharmony_ci AbilityRequest abilityRequest; 61eace7efcSopenharmony_ci abilityRequest.appInfo.bundleName = "com.example.fuzzTest"; 62eace7efcSopenharmony_ci abilityRequest.abilityInfo.name = "MainAbility"; 63eace7efcSopenharmony_ci abilityRequest.abilityInfo.type = AbilityType::DATA; 64eace7efcSopenharmony_ci std::shared_ptr<AbilityRecord> abilityRecord = AbilityRecord::CreateAbilityRecord(abilityRequest); 65eace7efcSopenharmony_ci if (abilityRecord) { 66eace7efcSopenharmony_ci token = abilityRecord->GetToken(); 67eace7efcSopenharmony_ci } 68eace7efcSopenharmony_ci return token; 69eace7efcSopenharmony_ci} 70eace7efcSopenharmony_ci 71eace7efcSopenharmony_civoid AbilityAutoStartupDataManagerFuzztest1(bool boolParam, std::string &stringParam, int32_t int32Param) 72eace7efcSopenharmony_ci{ 73eace7efcSopenharmony_ci std::shared_ptr<AbilityAutoStartupDataManager> dataMgr = std::make_shared<AbilityAutoStartupDataManager>(); 74eace7efcSopenharmony_ci dataMgr->CheckKvStore(); 75eace7efcSopenharmony_ci AutoStartupInfo info1; 76eace7efcSopenharmony_ci info1.userId = int32Param; 77eace7efcSopenharmony_ci dataMgr->InsertAutoStartupData(info1, boolParam, boolParam); // branch info1.bundleName empty 78eace7efcSopenharmony_ci info1.bundleName = "com.example.fuzzTest"; 79eace7efcSopenharmony_ci dataMgr->InsertAutoStartupData(info1, boolParam, boolParam); // branch info1.abilityName empty 80eace7efcSopenharmony_ci info1.abilityName = "MainAbility"; 81eace7efcSopenharmony_ci dataMgr->InsertAutoStartupData(info1, boolParam, boolParam); // branch info1.accestoken empty 82eace7efcSopenharmony_ci info1.accessTokenId = "AccessTokenId"; 83eace7efcSopenharmony_ci dataMgr->InsertAutoStartupData(info1, boolParam, boolParam); // branch info1.accestoken empty 84eace7efcSopenharmony_ci 85eace7efcSopenharmony_ci AutoStartupInfo info2; 86eace7efcSopenharmony_ci info2.userId = int32Param; 87eace7efcSopenharmony_ci dataMgr->UpdateAutoStartupData(info2, boolParam, boolParam); // branch info2.bundleName empty 88eace7efcSopenharmony_ci info2.bundleName = "com.example.fuzzTest"; 89eace7efcSopenharmony_ci dataMgr->UpdateAutoStartupData(info2, boolParam, boolParam); // branch info2.abilityName empty 90eace7efcSopenharmony_ci info2.abilityName = "MainAbility"; 91eace7efcSopenharmony_ci dataMgr->UpdateAutoStartupData(info2, boolParam, boolParam); // branch info2.accestoken empty 92eace7efcSopenharmony_ci info2.accessTokenId = "AccessTokenId"; 93eace7efcSopenharmony_ci dataMgr->UpdateAutoStartupData(info2, boolParam, boolParam); // branch info2.accestoken empty 94eace7efcSopenharmony_ci 95eace7efcSopenharmony_ci AutoStartupInfo info3; 96eace7efcSopenharmony_ci info3.userId = int32Param; 97eace7efcSopenharmony_ci dataMgr->UpdateAutoStartupData(info3, boolParam, boolParam); // branch info3.bundleName empty 98eace7efcSopenharmony_ci info3.bundleName = "com.example.fuzzTest"; 99eace7efcSopenharmony_ci dataMgr->UpdateAutoStartupData(info3, boolParam, boolParam); // branch info3.abilityName empty 100eace7efcSopenharmony_ci info3.abilityName = "MainAbility"; 101eace7efcSopenharmony_ci dataMgr->UpdateAutoStartupData(info3, boolParam, boolParam); // branch info3.accestoken empty 102eace7efcSopenharmony_ci info3.accessTokenId = "AccessTokenId"; 103eace7efcSopenharmony_ci dataMgr->UpdateAutoStartupData(info3, boolParam, boolParam); // branch userid 104eace7efcSopenharmony_ci 105eace7efcSopenharmony_ci dataMgr->DeleteAutoStartupData(stringParam, int32Param); // called 106eace7efcSopenharmony_ci 107eace7efcSopenharmony_ci AutoStartupInfo info4; 108eace7efcSopenharmony_ci info4.userId = int32Param; 109eace7efcSopenharmony_ci dataMgr->QueryAutoStartupData(info4); // branch info3.bundleName empty 110eace7efcSopenharmony_ci info4.bundleName = "com.example.fuzzTest"; 111eace7efcSopenharmony_ci dataMgr->QueryAutoStartupData(info4); // branch info3.abilityName empty 112eace7efcSopenharmony_ci info4.abilityName = "MainAbility"; 113eace7efcSopenharmony_ci dataMgr->QueryAutoStartupData(info4); // branch info3.accestoken empty 114eace7efcSopenharmony_ci info4.accessTokenId = "AccessTokenId"; 115eace7efcSopenharmony_ci dataMgr->QueryAutoStartupData(info4); // branch userid 116eace7efcSopenharmony_ci 117eace7efcSopenharmony_ci std::vector<AutoStartupInfo> vecs; 118eace7efcSopenharmony_ci vecs.emplace_back(info1); 119eace7efcSopenharmony_ci dataMgr->QueryAllAutoStartupApplications(vecs, int32Param); // called 120eace7efcSopenharmony_ci dataMgr->GetCurrentAppAutoStartupData(stringParam, vecs, stringParam); //called 121eace7efcSopenharmony_ci} 122eace7efcSopenharmony_ci 123eace7efcSopenharmony_civoid AbilityAutoStartupDataManagerFuzztest2(bool boolParam, std::string &stringParam, int32_t int32Param) 124eace7efcSopenharmony_ci{ 125eace7efcSopenharmony_ci std::shared_ptr<AbilityAutoStartupDataManager> dataMgr = std::make_shared<AbilityAutoStartupDataManager>(); 126eace7efcSopenharmony_ci AutoStartupInfo info1; 127eace7efcSopenharmony_ci info1.userId = int32Param; 128eace7efcSopenharmony_ci dataMgr->ConvertAutoStartupStatusToValue(boolParam, boolParam, info1.abilityName); 129eace7efcSopenharmony_ci 130eace7efcSopenharmony_ci DistributedKv::Value value1(jsonStr1); 131eace7efcSopenharmony_ci dataMgr->ConvertAutoStartupStatusFromValue(value1, boolParam, boolParam); // branch json 132eace7efcSopenharmony_ci DistributedKv::Value value2(jsonStr2); 133eace7efcSopenharmony_ci dataMgr->ConvertAutoStartupStatusFromValue(value2, boolParam, boolParam); // branch json 134eace7efcSopenharmony_ci DistributedKv::Value value3(jsonStr3); 135eace7efcSopenharmony_ci dataMgr->ConvertAutoStartupStatusFromValue(value3, boolParam, boolParam); // branch json 136eace7efcSopenharmony_ci DistributedKv::Value value4(jsonStr4); 137eace7efcSopenharmony_ci dataMgr->ConvertAutoStartupStatusFromValue(value4, boolParam, boolParam); // branch discard jsonstr 138eace7efcSopenharmony_ci} 139eace7efcSopenharmony_ci 140eace7efcSopenharmony_cibool DoSomethingInterestingWithMyAPI(const char* data, size_t size) 141eace7efcSopenharmony_ci{ 142eace7efcSopenharmony_ci bool boolParam = *data % ENABLE; 143eace7efcSopenharmony_ci std::string stringParam(data, size); 144eace7efcSopenharmony_ci int32_t int32Param = static_cast<int32_t>(GetU32Data(data)); 145eace7efcSopenharmony_ci AbilityAutoStartupDataManagerFuzztest1(boolParam, stringParam, int32Param); 146eace7efcSopenharmony_ci AbilityAutoStartupDataManagerFuzztest2(boolParam, stringParam, int32Param); 147eace7efcSopenharmony_ci return true; 148eace7efcSopenharmony_ci} 149eace7efcSopenharmony_ci} 150eace7efcSopenharmony_ci 151eace7efcSopenharmony_ci/* Fuzzer entry point */ 152eace7efcSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 153eace7efcSopenharmony_ci{ 154eace7efcSopenharmony_ci /* Run your code on data */ 155eace7efcSopenharmony_ci if (data == nullptr) { 156eace7efcSopenharmony_ci return 0; 157eace7efcSopenharmony_ci } 158eace7efcSopenharmony_ci 159eace7efcSopenharmony_ci /* Validate the length of size */ 160eace7efcSopenharmony_ci if (size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) { 161eace7efcSopenharmony_ci return 0; 162eace7efcSopenharmony_ci } 163eace7efcSopenharmony_ci 164eace7efcSopenharmony_ci char* ch = (char*)malloc(size + 1); 165eace7efcSopenharmony_ci if (ch == nullptr) { 166eace7efcSopenharmony_ci std::cout << "malloc failed." << std::endl; 167eace7efcSopenharmony_ci return 0; 168eace7efcSopenharmony_ci } 169eace7efcSopenharmony_ci 170eace7efcSopenharmony_ci (void)memset_s(ch, size + 1, 0x00, size + 1); 171eace7efcSopenharmony_ci if (memcpy_s(ch, size, data, size) != EOK) { 172eace7efcSopenharmony_ci std::cout << "copy failed." << std::endl; 173eace7efcSopenharmony_ci free(ch); 174eace7efcSopenharmony_ci ch = nullptr; 175eace7efcSopenharmony_ci return 0; 176eace7efcSopenharmony_ci } 177eace7efcSopenharmony_ci 178eace7efcSopenharmony_ci OHOS::DoSomethingInterestingWithMyAPI(ch, size); 179eace7efcSopenharmony_ci free(ch); 180eace7efcSopenharmony_ci ch = nullptr; 181eace7efcSopenharmony_ci return 0; 182eace7efcSopenharmony_ci} 183eace7efcSopenharmony_ci 184