13fc297bdSopenharmony_ci/*
23fc297bdSopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
33fc297bdSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43fc297bdSopenharmony_ci * you may not use this file except in compliance with the License.
53fc297bdSopenharmony_ci * You may obtain a copy of the License at
63fc297bdSopenharmony_ci *
73fc297bdSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83fc297bdSopenharmony_ci *
93fc297bdSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103fc297bdSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113fc297bdSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123fc297bdSopenharmony_ci * See the License for the specific language governing permissions and
133fc297bdSopenharmony_ci * limitations under the License.
143fc297bdSopenharmony_ci */
153fc297bdSopenharmony_ci
163fc297bdSopenharmony_ci#include "loadconfigxmlfile_fuzzer.h"
173fc297bdSopenharmony_ci
183fc297bdSopenharmony_ci#define private public
193fc297bdSopenharmony_ci#include "socperf.h"
203fc297bdSopenharmony_ci
213fc297bdSopenharmony_cinamespace OHOS {
223fc297bdSopenharmony_cinamespace SOCPERF {
233fc297bdSopenharmony_ci    const std::string fuzzedFile = "myFuzzed.xml";
243fc297bdSopenharmony_ci    const int32_t FILE_RETURN_SUCCESS = 1;
253fc297bdSopenharmony_ci    std::mutex mutexLock;
263fc297bdSopenharmony_ci    std::unique_ptr<SocPerf> socPerf = nullptr;
273fc297bdSopenharmony_ci
283fc297bdSopenharmony_ci    bool DoInit()
293fc297bdSopenharmony_ci    {
303fc297bdSopenharmony_ci        std::lock_guard<std::mutex> lock(mutexLock);
313fc297bdSopenharmony_ci        if (socPerf) {
323fc297bdSopenharmony_ci            return true;
333fc297bdSopenharmony_ci        }
343fc297bdSopenharmony_ci        socPerf = std::make_unique<SocPerf>();
353fc297bdSopenharmony_ci        return socPerf != nullptr;
363fc297bdSopenharmony_ci    }
373fc297bdSopenharmony_ci
383fc297bdSopenharmony_ci    void DoSomethingInterestingWithMyAPI(const uint8_t* data, size_t size)
393fc297bdSopenharmony_ci    {
403fc297bdSopenharmony_ci        if (!DoInit()) {
413fc297bdSopenharmony_ci            return;
423fc297bdSopenharmony_ci        }
433fc297bdSopenharmony_ci
443fc297bdSopenharmony_ci        // generate fuzzed xml
453fc297bdSopenharmony_ci        FILE *pFile = fopen(fuzzedFile.c_str(), "wb");
463fc297bdSopenharmony_ci        if (!pFile) {
473fc297bdSopenharmony_ci            return;
483fc297bdSopenharmony_ci        }
493fc297bdSopenharmony_ci
503fc297bdSopenharmony_ci        int32_t retCode = fwrite(reinterpret_cast<const void*>(data), size, 1, pFile); // 1 means count=1
513fc297bdSopenharmony_ci        if (retCode < FILE_RETURN_SUCCESS) {
523fc297bdSopenharmony_ci            (void)fclose(pFile);
533fc297bdSopenharmony_ci            pFile = nullptr;
543fc297bdSopenharmony_ci            return;
553fc297bdSopenharmony_ci        }
563fc297bdSopenharmony_ci
573fc297bdSopenharmony_ci        (void)fclose(pFile);
583fc297bdSopenharmony_ci        pFile = nullptr;
593fc297bdSopenharmony_ci        socPerf->socPerfConfig_.LoadConfigXmlFile(fuzzedFile);
603fc297bdSopenharmony_ci    }
613fc297bdSopenharmony_ci} // namespace SOCPERF
623fc297bdSopenharmony_ci} // namespace OHOS
633fc297bdSopenharmony_ci
643fc297bdSopenharmony_ci/* Fuzzer entry point */
653fc297bdSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
663fc297bdSopenharmony_ci{
673fc297bdSopenharmony_ci    /* Run your code on data */
683fc297bdSopenharmony_ci    OHOS::SOCPERF::DoSomethingInterestingWithMyAPI(data, size);
693fc297bdSopenharmony_ci    return 0;
703fc297bdSopenharmony_ci}
71