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