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 }