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 std::string serviceName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
30 ScanMdnsService::GetInstance().SetServiceType(serviceName.c_str());
31 ScanMdnsService::GetInstance().onStartDiscoverService();
32 ScanMdnsService::GetInstance().onStopDiscoverService();
33 }
34
TestSetService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)35 void TestSetService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
36 {
37 MDnsServiceInfo info;
38 ScanMdnsService::GetInstance().SetServiceInfo(info);
39 sptr<ScanMDnsResolveObserver> resolveObserve;
40 ScanMdnsService::GetInstance().SetMDnsResolveCallBack(resolveObserve);
41 sptr<ScanMDnsDiscoveryObserver> discoveryObserve;
42 ScanMdnsService::GetInstance().SetMDnsDiscoveryCallBack(discoveryObserve);
43 ScanMdnsService::GetInstance().onStartDiscoverService();
44 std::string stype = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
45 ScanMdnsService::GetInstance().SetServiceType(stype);
46 ScanMdnsService::GetInstance().GetMDnsResolveCallBack();
47 ScanMdnsService::GetInstance().GetMDnsDiscoveryCallBack();
48 ScanMdnsService::GetInstance().GetServiceInfo();
49 }
50
TestGetServiceAttribute(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)51 void TestGetServiceAttribute(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
52 {
53 MDnsServiceInfo serviceInfo;
54 serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
55 std::string keyStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
56 ScanMdnsService::GetInstance().GetServiceAttribute(serviceInfo, keyStr);
57 }
58
TestonResolveService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)59 void TestonResolveService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
60 {
61 MDnsServiceInfo serviceInfo;
62 serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
63 ScanMdnsService::GetInstance().onResolveService(serviceInfo);
64 }
65
TestToMDnsScaner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)66 void TestToMDnsScaner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
67 {
68 MDnsServiceInfo serviceInfo;
69 serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
70 ScanMdnsService::GetInstance().ToMDnsScaner(serviceInfo);
71 }
72
TestHandleServiceFound(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)73 void TestHandleServiceFound(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
74 {
75 MDnsServiceInfo serviceInfo;
76 ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo);
77 int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
78 scanMDnsDiscoveryObserver.HandleServiceFound(serviceInfo, retCode);
79 }
80
TestHandleResolveResult(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)81 void TestHandleResolveResult(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
82 {
83 MDnsServiceInfo serviceInfo;
84 ScanMDnsResolveObserver scanMDnsResolveObserver = ScanMDnsResolveObserver(serviceInfo);
85 int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
86 scanMDnsResolveObserver.HandleResolveResult(serviceInfo, retCode);
87 }
88
TestHandleStopDiscover(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)89 void TestHandleStopDiscover(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
90 {
91 MDnsServiceInfo serviceInfo;
92 ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo);
93 int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
94 scanMDnsDiscoveryObserver.HandleStopDiscover(serviceInfo, retCode);
95 }
96
97 }
98 }
99
100 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)101 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
102 {
103 if (data == nullptr) {
104 return 0;
105 }
106
107 if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
108 return 0;
109 }
110 FuzzedDataProvider dataProvider(data, size);
111 OHOS::Scan::TestOnStartDiscoverService(data, size, &dataProvider);
112 OHOS::Scan::TestGetServiceAttribute(data, size, &dataProvider);
113 OHOS::Scan::TestonResolveService(data, size, &dataProvider);
114 OHOS::Scan::TestToMDnsScaner(data, size, &dataProvider);
115 OHOS::Scan::TestHandleServiceFound(data, size, &dataProvider);
116 OHOS::Scan::TestHandleResolveResult(data, size, &dataProvider);
117 OHOS::Scan::TestHandleStopDiscover(data, size, &dataProvider);
118 return 0;
119 }
120
121