1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci
16d9f0492fSopenharmony_ci#include "systemtraversalparameter_fuzzer.h"
17d9f0492fSopenharmony_ci
18d9f0492fSopenharmony_ci#include <string>
19d9f0492fSopenharmony_ci#include "fuzz_utils.h"
20d9f0492fSopenharmony_ci#include "init.h"
21d9f0492fSopenharmony_ci#include "securec.h"
22d9f0492fSopenharmony_ci#include "init_param.h"
23d9f0492fSopenharmony_ci#include "param_init.h"
24d9f0492fSopenharmony_ci
25d9f0492fSopenharmony_cistatic void FakeShowParam(ParamHandle handle, void *cookie)
26d9f0492fSopenharmony_ci{
27d9f0492fSopenharmony_ci    Cookie *nameAndValue = reinterpret_cast<Cookie*>(cookie);
28d9f0492fSopenharmony_ci    char *name = nameAndValue->data;
29d9f0492fSopenharmony_ci    unsigned int nameLen = nameAndValue->size;
30d9f0492fSopenharmony_ci    char value[PARAM_CONST_VALUE_LEN_MAX] = {0};
31d9f0492fSopenharmony_ci    SystemGetParameterName(handle, name, nameLen);
32d9f0492fSopenharmony_ci    uint32_t size = PARAM_CONST_VALUE_LEN_MAX;
33d9f0492fSopenharmony_ci    SystemGetParameterValue(handle, value, &size);
34d9f0492fSopenharmony_ci    printf("\t%s = %s \n", name, value);
35d9f0492fSopenharmony_ci}
36d9f0492fSopenharmony_ci
37d9f0492fSopenharmony_cinamespace OHOS {
38d9f0492fSopenharmony_ci    bool FuzzSystemTraversalParameter(const uint8_t* data, size_t size)
39d9f0492fSopenharmony_ci    {
40d9f0492fSopenharmony_ci        bool result = false;
41d9f0492fSopenharmony_ci        CloseStdout();
42d9f0492fSopenharmony_ci        Cookie instance = {0, nullptr};
43d9f0492fSopenharmony_ci        Cookie *cookie = &instance;
44d9f0492fSopenharmony_ci        if (size == 0) {
45d9f0492fSopenharmony_ci            return false;
46d9f0492fSopenharmony_ci        }
47d9f0492fSopenharmony_ci        if (size > PARAM_CONST_VALUE_LEN_MAX + PARAM_NAME_LEN_MAX) {
48d9f0492fSopenharmony_ci            return true;
49d9f0492fSopenharmony_ci        }
50d9f0492fSopenharmony_ci        cookie->data = static_cast<char *>(calloc(1, size));
51d9f0492fSopenharmony_ci        if (cookie->data == nullptr) {
52d9f0492fSopenharmony_ci            return true;
53d9f0492fSopenharmony_ci        }
54d9f0492fSopenharmony_ci        cookie->size = size;
55d9f0492fSopenharmony_ci        std::string str(reinterpret_cast<const char*>(data), size - 1);
56d9f0492fSopenharmony_ci        int ret = memcpy_s(cookie->data, size, str.c_str(), size);
57d9f0492fSopenharmony_ci        if (ret != EOK) {
58d9f0492fSopenharmony_ci            return false;
59d9f0492fSopenharmony_ci        }
60d9f0492fSopenharmony_ci        if (!SystemTraversalParameter(nullptr, FakeShowParam, reinterpret_cast<void*>(cookie))) {
61d9f0492fSopenharmony_ci            result = true;
62d9f0492fSopenharmony_ci        }
63d9f0492fSopenharmony_ci        free(cookie->data);
64d9f0492fSopenharmony_ci        cookie->data = nullptr;
65d9f0492fSopenharmony_ci        cookie->size = 0;
66d9f0492fSopenharmony_ci        return result;
67d9f0492fSopenharmony_ci    }
68d9f0492fSopenharmony_ci}
69d9f0492fSopenharmony_ci
70d9f0492fSopenharmony_ci/* Fuzzer entry point */
71d9f0492fSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
72d9f0492fSopenharmony_ci{
73d9f0492fSopenharmony_ci    /* Run your code on data */
74d9f0492fSopenharmony_ci    OHOS::FuzzSystemTraversalParameter(data, size);
75d9f0492fSopenharmony_ci    return 0;
76d9f0492fSopenharmony_ci}
77