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 "fuzzer/FuzzedDataProvider.h"
17 #include "scanmdnsservice_fuzzer.h"
18 #include "scan_mdns_service.h"
19
20 namespace OHOS {
21 namespace Scan {
22 constexpr uint8_t MAX_STRING_LENGTH = 255;
23 constexpr int MAX_SET_NUMBER = 100;
24 constexpr size_t FOO_MAX_LEN = 1024;
25 constexpr size_t U32_AT_SIZE = 4;
26
TestOnStartDiscoverService(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)27 void TestOnStartDiscoverService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
28 {
29 ScanMdnsService::GetInstance().SetServiceType("_scanner._tcp");
30 ScanMdnsService::GetInstance().onStartDiscoverService();
31 }
32
TestSetServiceInfo(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)33 void TestSetServiceInfo(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
34 {
35 MDnsServiceInfo info;
36 ScanMdnsService::GetInstance().SetServiceInfo(info);
37 }
38
TestSetMDnsResolveCallBack(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)39 void TestSetMDnsResolveCallBack(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
40 {
41 sptr<ScanMDnsResolveObserver> cb;
42 ScanMdnsService::GetInstance().SetMDnsResolveCallBack(cb);
43 }
44
TestSetMDnsDiscoveryCallBack(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)45 void TestSetMDnsDiscoveryCallBack(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
46 {
47 sptr<ScanMDnsDiscoveryObserver> cb;
48 ScanMdnsService::GetInstance().SetMDnsDiscoveryCallBack(cb);
49 ScanMdnsService::GetInstance().onStartDiscoverService();
50 }
51
TestSetServiceType(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)52 void TestSetServiceType(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
53 {
54 std::string stype = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
55 ScanMdnsService::GetInstance().SetServiceType(stype);
56 }
57
TestGetMDnsResolveCallBack(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)58 void TestGetMDnsResolveCallBack(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
59 {
60 ScanMdnsService::GetInstance().GetMDnsResolveCallBack();
61 }
62
TestGetMDnsDiscoveryCallBack(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)63 void TestGetMDnsDiscoveryCallBack(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
64 {
65 ScanMdnsService::GetInstance().GetMDnsDiscoveryCallBack();
66 }
67
TestGetServiceInfo(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)68 void TestGetServiceInfo(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
69 {
70 ScanMdnsService::GetInstance().GetServiceInfo();
71 }
72
TestGetServiceAttribute(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)73 void TestGetServiceAttribute(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
74 {
75 MDnsServiceInfo serviceInfo;
76 std::string keyStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
77 ScanMdnsService::GetInstance().GetServiceAttribute(serviceInfo, keyStr);
78 }
79
TestonStopDiscoverService(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)80 void TestonStopDiscoverService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
81 {
82 ScanMdnsService::GetInstance().onStopDiscoverService();
83 }
84
TestonResolveService(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)85 void TestonResolveService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
86 {
87 MDnsServiceInfo serviceInfo;
88 ScanMdnsService::GetInstance().onResolveService(serviceInfo);
89 }
90
TestToMDnsScaner(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)91 void TestToMDnsScaner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
92 {
93 MDnsServiceInfo serviceInfo;
94 ScanMdnsService::GetInstance().ToMDnsScaner(serviceInfo);
95 }
96
TestHandleServiceFound(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)97 void TestHandleServiceFound(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
98 {
99 MDnsServiceInfo serviceInfo;
100 ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo);
101 int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
102 scanMDnsDiscoveryObserver.HandleServiceFound(serviceInfo, retCode);
103 }
104
TestHandleResolveResult(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)105 void TestHandleResolveResult(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
106 {
107 MDnsServiceInfo serviceInfo;
108 ScanMDnsResolveObserver scanMDnsResolveObserver = ScanMDnsResolveObserver(serviceInfo);
109 int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
110 scanMDnsResolveObserver.HandleResolveResult(serviceInfo, retCode);
111 }
112
TestHandleStopDiscover(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)113 void TestHandleStopDiscover(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
114 {
115 MDnsServiceInfo serviceInfo;
116 ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo);
117 int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
118 scanMDnsDiscoveryObserver.HandleStopDiscover(serviceInfo, retCode);
119 }
120
121 }
122 }
123
124 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)125 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
126 {
127 if (data == nullptr) {
128 return 0;
129 }
130
131 if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
132 return 0;
133 }
134 FuzzedDataProvider dataProvider(data, size);
135 OHOS::Scan::TestOnStartDiscoverService(data, size, &dataProvider);
136 OHOS::Scan::TestSetServiceInfo(data, size, &dataProvider);
137 OHOS::Scan::TestSetMDnsResolveCallBack(data, size, &dataProvider);
138 OHOS::Scan::TestSetMDnsDiscoveryCallBack(data, size, &dataProvider);
139 OHOS::Scan::TestSetServiceType(data, size, &dataProvider);
140 OHOS::Scan::TestGetMDnsResolveCallBack(data, size, &dataProvider);
141 OHOS::Scan::TestGetMDnsDiscoveryCallBack(data, size, &dataProvider);
142 OHOS::Scan::TestGetServiceInfo(data, size, &dataProvider);
143 OHOS::Scan::TestGetServiceAttribute(data, size, &dataProvider);
144 OHOS::Scan::TestonStopDiscoverService(data, size, &dataProvider);
145 OHOS::Scan::TestonResolveService(data, size, &dataProvider);
146 OHOS::Scan::TestToMDnsScaner(data, size, &dataProvider);
147 OHOS::Scan::TestHandleServiceFound(data, size, &dataProvider);
148 OHOS::Scan::TestHandleResolveResult(data, size, &dataProvider);
149 OHOS::Scan::TestHandleStopDiscover(data, size, &dataProvider);
150 return 0;
151 }
152
153