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