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 <cstring>
17 #include <securec.h>
18 #include <unordered_map>
19 #include <vector>
20 #include <fuzzer/FuzzedDataProvider.h>
21
22 #define private public
23 #include "nweb.h"
24 #include "nweb_config_helper.h"
25 #include "nweb_adapter_helper.h"
26 #include "nweb_c_api.h"
27 #include "nweb_create_window.h"
28 #include "nweb_helper.h"
29 #include "nweb_init_params.h"
30 #include "nweb_log.h"
31
32 using namespace OHOS;
33 using namespace OHOS::Rosen;
34 using namespace OHOS::AbilityRuntime;
35
36 namespace OHOS {
37 namespace {
38 sptr<Surface> g_surface = nullptr;
39 const int DEFAULT_WIDTH = 2560;
40 const int DEFAULT_HEIGHT = 1396;
41 const int32_t NWEB_MAX_WIDTH = 7681;
42 const std::string MOCK_INSTALLATION_DIR = "/data/app/el1/bundle/public/com.huawei.hmos.arkwebcore";
43 } // namespace
44
45 namespace NWeb {
46 constexpr int MAX_SET_NUMBER = 1000;
47 constexpr uint8_t MAX_STRING_LENGTH = 255;
48 std::unordered_map<std::string, std::string> g_argsMap;
49
NWebHelperFuzzTest(const uint8_t * data,size_t size)50 bool NWebHelperFuzzTest(const uint8_t* data, size_t size)
51 {
52 FuzzedDataProvider dataProvider(data, size);
53 int32_t nweb_id = dataProvider.ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
54 bool result = NWebHelper::Instance().LoadNWebSDK();
55 (void)result;
56 NWebHelper::Instance().SetBundlePath(MOCK_INSTALLATION_DIR);
57 result = NWebAdapterHelper::Instance().Init(true);
58 (void)result;
59 std::shared_ptr<NWebCreateInfoImpl> create_info = std::make_shared<NWebCreateInfoImpl>();
60 std::shared_ptr<NWeb> nweb = NWebHelper::Instance().CreateNWeb(create_info);
61 (void)nweb;
62 std::shared_ptr<NWebDOHConfigImpl> config = std::make_shared<NWebDOHConfigImpl>();
63 auto nwebHelper = NWebHelper::Instance().GetNWeb(nweb_id);
64 (void)nwebHelper;
65 NWebHelper::Instance().PrepareForPageLoad("web_test", true, 0);
66 NWebHelper::Instance().WarmupServiceWorker("web_test");
67 NWebHelper::Instance().PrefetchResource(nullptr, {}, "web_test", 0);
68 NWebHelper::Instance().ClearPrefetchedResource({ "web_test" });
69 NWebAdapterHelper::Instance().ReadConfigIfNeeded();
70 result = NWebHelper::Instance().InitAndRun(false);
71 (void)result;
72
73 result = NWebHelper::Instance().InitAndRun(false);
74 (void)result;
75 NWebAdapterHelper::Instance().CreateNWeb(g_surface, GetInitArgs(), DEFAULT_WIDTH, DEFAULT_HEIGHT);
76 result = NWebHelper::Instance().InitAndRun(false);
77 (void)result;
78 NWebAdapterHelper::Instance().CreateNWeb(g_surface, GetInitArgs(), DEFAULT_WIDTH, DEFAULT_HEIGHT);
79 result = NWebHelper::Instance().LoadNWebSDK();
80 (void)result;
81 result = NWebHelper::Instance().LoadNWebSDK();
82 (void)result;
83 std::vector<std::string> hosts;
84 NWebHelper::Instance().SetAppCustomUserAgent("web_test");
85 NWebHelper::Instance().SetUserAgentForHosts("web_test", hosts);
86 return true;
87 }
88
NWebHelperFuzzTest_002(const uint8_t * data,size_t size)89 bool NWebHelperFuzzTest_002(const uint8_t* data, size_t size)
90 {
91 auto web_storage = NWebHelper::Instance().GetWebStorage();
92 bool result = false;
93 if (web_storage != nullptr) {
94 result = true;
95 }
96 FuzzedDataProvider dataProvider(data, size);
97 std::string stringParam = dataProvider.ConsumeRandomLengthString(MAX_STRING_LENGTH);
98 (void)result;
99 std::string config = NWebAdapterHelper::Instance().ParsePerfConfig(stringParam, "test");
100 (void)config;
101 NWebConfigHelper::Instance().perfConfig_.emplace("web/test", "web_test");
102 config = NWebAdapterHelper::Instance().ParsePerfConfig(stringParam, "test");
103 (void)config;
104 return true;
105 }
106
NWebHelperFuzzTest_003(const uint8_t * data,size_t size)107 bool NWebHelperFuzzTest_003(const uint8_t* data, size_t size)
108 {
109 auto dataBase = NWebHelper::Instance().GetDataBase();
110 bool result = false;
111 if (dataBase != nullptr) {
112 result = true;
113 }
114 (void)result;
115
116 std::shared_ptr<NWebCookieManager> cook = NWebHelper::Instance().GetCookieManager();
117 (void)cook;
118
119 void* enhanceSurfaceInfo = nullptr;
120 FuzzedDataProvider dataProvider(data, size);
121 int32_t randomWidth = dataProvider.ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
122 int32_t randomHeight = dataProvider.ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
123 int32_t temp = 1;
124 std::shared_ptr<NWeb> nweb =
125 NWebAdapterHelper::Instance().CreateNWeb(enhanceSurfaceInfo, GetInitArgs(), randomWidth, randomHeight);
126 (void)nweb;
127 enhanceSurfaceInfo = static_cast<void*>(&temp);
128 nweb = NWebAdapterHelper::Instance().CreateNWeb(enhanceSurfaceInfo, GetInitArgs(), DEFAULT_WIDTH, DEFAULT_HEIGHT);
129 (void)nweb;
130 nweb = NWebAdapterHelper::Instance().CreateNWeb(enhanceSurfaceInfo, GetInitArgs(), DEFAULT_WIDTH, NWEB_MAX_WIDTH);
131 (void)nweb;
132 nweb = NWebAdapterHelper::Instance().CreateNWeb(enhanceSurfaceInfo, GetInitArgs(), NWEB_MAX_WIDTH, DEFAULT_HEIGHT);
133 (void)nweb;
134 std::shared_ptr<NWebCreateInfoImpl> create_info = std::make_shared<NWebCreateInfoImpl>();
135 nweb = NWebHelper::Instance().CreateNWeb(create_info);
136 (void)nweb;
137 return true;
138 }
139
NWebHelperFuzzTest_004(const uint8_t * data,size_t size)140 bool NWebHelperFuzzTest_004(const uint8_t* data, size_t size)
141 {
142 FuzzedDataProvider dataProvider(data, size);
143 int32_t capacity = dataProvider.ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
144 NWebHelper::Instance().SetBlanklessLoadingCacheCapacity(capacity);
145 return true;
146 }
147
NWebHelperFuzzTest_005(const uint8_t * data,size_t size)148 bool NWebHelperFuzzTest_005(const uint8_t* data, size_t size)
149 {
150 FuzzedDataProvider dataProvider(data, size);
151 uint32_t urlSize = dataProvider.ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
152 std::vector<std::string> urls;
153 for (uint32_t idx = 0; idx < urlSize; idx++) {
154 urls.push_back(dataProvider.ConsumeRandomLengthString(MAX_STRING_LENGTH));
155 }
156 NWebHelper::Instance().ClearBlanklessLoadingCache(urls);
157 return true;
158 }
159
NWebHelperFuzzTest_006(const uint8_t * data,size_t size)160 bool NWebHelperFuzzTest_006(const uint8_t* data, size_t size)
161 {
162 FuzzedDataProvider dataProvider(data, size);
163 std::string url = dataProvider.ConsumeRandomLengthString(MAX_STRING_LENGTH);
164 int32_t nweb_id = dataProvider.ConsumeIntegral<int32_t>();
165 NWebHelper::Instance().CheckBlankOptEnable(url, nweb_id);
166 return true;
167 }
168 } // namespace NWeb
169 } // namespace OHOS
170
171 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)172 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
173 {
174 /* Run your code on data */
175 OHOS::NWeb::NWebHelperFuzzTest(data, size);
176 OHOS::NWeb::NWebHelperFuzzTest_002(data, size);
177 OHOS::NWeb::NWebHelperFuzzTest_003(data, size);
178 OHOS::NWeb::NWebHelperFuzzTest_004(data, size);
179 OHOS::NWeb::NWebHelperFuzzTest_005(data, size);
180 OHOS::NWeb::NWebHelperFuzzTest_006(data, size);
181 return 0;
182 }
183