1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ecmascript/ohos/aot_runtime_info.h"
17 #include "setruntimeinfo_fuzzer.h"
18 #include <fuzzer/FuzzedDataProvider.h>
19 
20 using namespace panda::ecmascript::ohos;
21 
22 namespace OHOS {
23 
24 class AotRuntimeInfoTest : public AotRuntimeInfo {
25 public:
TestSetRuntimeInfo(const char *realOutPath, char lines[][BUFFER_SIZE], int length) const26     void TestSetRuntimeInfo(const char *realOutPath, char lines[][BUFFER_SIZE], int length) const
27     {
28         SetRuntimeInfo(realOutPath, lines, length);
29     }
30 
TestGetRuntimeInfoByPath(char lines[][BUFFER_SIZE], const char *realOutPath, const char *soBuildId) const31     void TestGetRuntimeInfoByPath(char lines[][BUFFER_SIZE], const char *realOutPath, const char *soBuildId) const
32     {
33         GetRuntimeInfoByPath(lines, realOutPath, soBuildId);
34     }
35 
TestGetRuntimeBuildId(char *buildId, int length) const36     virtual bool TestGetRuntimeBuildId(char *buildId, int length) const
37     {
38         return GetRuntimeBuildId(buildId, length);
39     }
40 };
41 
SetRuntimeInfoFuzzTest([[maybe_unused]] const uint8_t *data, size_t size)42     void SetRuntimeInfoFuzzTest([[maybe_unused]] const uint8_t *data, size_t size)
43     {
44         FuzzedDataProvider dataProvider(data, size);
45 
46         // Generate a random output file path
47         std::string realOutPath = "/tmp/fuzz_test_" + std::to_string(dataProvider.ConsumeIntegral<uint32_t>());
48 
49         // Generate random lines content
50         constexpr int bufferSize = 4096;
51         constexpr int maxLength = 255;
52         char lines[maxLength][bufferSize] = {};
53 
54         int lineCount = dataProvider.ConsumeIntegralInRange<int>(1, maxLength);
55         for (int i = 0; i < lineCount; ++i) {
56             std::string line = dataProvider.ConsumeRandomLengthString(bufferSize - 1);
57         }
58 
59         AotRuntimeInfoTest runtimeInfoTest;
60         runtimeInfoTest.TestSetRuntimeInfo(realOutPath.c_str(), lines, maxLength);
61 
62         // Clean up the created file
63         unlink(realOutPath.c_str());
64     };
65 
GetRuntimeInfoByPathFuzzTest(const uint8_t *data, size_t size)66     void GetRuntimeInfoByPathFuzzTest(const uint8_t *data, size_t size)
67     {
68         FuzzedDataProvider dataProvider(data, size);
69 
70         // Generate a random output file path
71         std::string realOutPath = dataProvider.ConsumeRandomLengthString(AotRuntimeInfo::MAX_LENGTH);
72 
73         // Generate a random Build ID
74         std::string soBuildId = dataProvider.ConsumeRandomLengthString(AotRuntimeInfo::BUFFER_SIZE - 1);
75 
76         // prepare lines
77         char lines[AotRuntimeInfo::MAX_LENGTH][AotRuntimeInfo::BUFFER_SIZE] = {{0}};
78 
79         AotRuntimeInfoTest runtimeInfoTest;
80         runtimeInfoTest.TestGetRuntimeInfoByPath(lines, realOutPath.c_str(), soBuildId.c_str());
81     };
82 
GetRuntimeBuildIdFuzzTest(const uint8_t *data, size_t size)83     void GetRuntimeBuildIdFuzzTest(const uint8_t *data, size_t size)
84     {
85         FuzzedDataProvider dataProvider(data, size);
86 
87         // generate a random buildIdLength
88         int buildIdLength = dataProvider.ConsumeIntegralInRange<int>(1, PATH_MAX);
89 
90         // Generate a random Build ID
91         char buildId[PATH_MAX] = {'\0'};
92 
93         AotRuntimeInfoTest runtimeInfoTest;
94         runtimeInfoTest.TestGetRuntimeBuildId(buildId, buildIdLength);
95     }
96 }
97 
98 // Fuzzer entry point.
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)99 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
100 {
101     // Run your code on data.
102     OHOS::SetRuntimeInfoFuzzTest(data, size);
103     OHOS::GetRuntimeInfoByPathFuzzTest(data, size);
104     OHOS::GetRuntimeBuildIdFuzzTest(data, size);
105     return 0;
106 }