• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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