146debc2cSopenharmony_ci/* 246debc2cSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 346debc2cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 446debc2cSopenharmony_ci * you may not use this file except in compliance with the License. 546debc2cSopenharmony_ci * You may obtain a copy of the License at 646debc2cSopenharmony_ci * 746debc2cSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 846debc2cSopenharmony_ci * 946debc2cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1046debc2cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1146debc2cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1246debc2cSopenharmony_ci * See the License for the specific language governing permissions and 1346debc2cSopenharmony_ci * limitations under the License. 1446debc2cSopenharmony_ci */ 1546debc2cSopenharmony_ci 1646debc2cSopenharmony_ci#include "fuzzer/FuzzedDataProvider.h" 1746debc2cSopenharmony_ci#include "scanmdnsservice_fuzzer.h" 1846debc2cSopenharmony_ci#include "scan_mdns_service.h" 1946debc2cSopenharmony_ci 2046debc2cSopenharmony_cinamespace OHOS { 2146debc2cSopenharmony_cinamespace Scan { 2246debc2cSopenharmony_ci constexpr uint8_t MAX_STRING_LENGTH = 255; 2346debc2cSopenharmony_ci constexpr int MAX_SET_NUMBER = 100; 2446debc2cSopenharmony_ci constexpr size_t FOO_MAX_LEN = 1024; 2546debc2cSopenharmony_ci constexpr size_t U32_AT_SIZE = 4; 2646debc2cSopenharmony_ci 2746debc2cSopenharmony_ci void TestOnStartDiscoverService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 2846debc2cSopenharmony_ci { 2946debc2cSopenharmony_ci std::string serviceName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 3046debc2cSopenharmony_ci ScanMdnsService::GetInstance().SetServiceType(serviceName.c_str()); 3146debc2cSopenharmony_ci ScanMdnsService::GetInstance().onStartDiscoverService(); 3246debc2cSopenharmony_ci ScanMdnsService::GetInstance().onStopDiscoverService(); 3346debc2cSopenharmony_ci } 3446debc2cSopenharmony_ci 3546debc2cSopenharmony_ci void TestSetService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 3646debc2cSopenharmony_ci { 3746debc2cSopenharmony_ci MDnsServiceInfo info; 3846debc2cSopenharmony_ci ScanMdnsService::GetInstance().SetServiceInfo(info); 3946debc2cSopenharmony_ci sptr<ScanMDnsResolveObserver> resolveObserve; 4046debc2cSopenharmony_ci ScanMdnsService::GetInstance().SetMDnsResolveCallBack(resolveObserve); 4146debc2cSopenharmony_ci sptr<ScanMDnsDiscoveryObserver> discoveryObserve; 4246debc2cSopenharmony_ci ScanMdnsService::GetInstance().SetMDnsDiscoveryCallBack(discoveryObserve); 4346debc2cSopenharmony_ci ScanMdnsService::GetInstance().onStartDiscoverService(); 4446debc2cSopenharmony_ci std::string stype = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 4546debc2cSopenharmony_ci ScanMdnsService::GetInstance().SetServiceType(stype); 4646debc2cSopenharmony_ci ScanMdnsService::GetInstance().GetMDnsResolveCallBack(); 4746debc2cSopenharmony_ci ScanMdnsService::GetInstance().GetMDnsDiscoveryCallBack(); 4846debc2cSopenharmony_ci ScanMdnsService::GetInstance().GetServiceInfo(); 4946debc2cSopenharmony_ci } 5046debc2cSopenharmony_ci 5146debc2cSopenharmony_ci void TestGetServiceAttribute(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 5246debc2cSopenharmony_ci { 5346debc2cSopenharmony_ci MDnsServiceInfo serviceInfo; 5446debc2cSopenharmony_ci serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 5546debc2cSopenharmony_ci std::string keyStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 5646debc2cSopenharmony_ci ScanMdnsService::GetInstance().GetServiceAttribute(serviceInfo, keyStr); 5746debc2cSopenharmony_ci } 5846debc2cSopenharmony_ci 5946debc2cSopenharmony_ci void TestonResolveService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 6046debc2cSopenharmony_ci { 6146debc2cSopenharmony_ci MDnsServiceInfo serviceInfo; 6246debc2cSopenharmony_ci serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 6346debc2cSopenharmony_ci ScanMdnsService::GetInstance().onResolveService(serviceInfo); 6446debc2cSopenharmony_ci } 6546debc2cSopenharmony_ci 6646debc2cSopenharmony_ci void TestToMDnsScaner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 6746debc2cSopenharmony_ci { 6846debc2cSopenharmony_ci MDnsServiceInfo serviceInfo; 6946debc2cSopenharmony_ci serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 7046debc2cSopenharmony_ci ScanMdnsService::GetInstance().ToMDnsScaner(serviceInfo); 7146debc2cSopenharmony_ci } 7246debc2cSopenharmony_ci 7346debc2cSopenharmony_ci void TestHandleServiceFound(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 7446debc2cSopenharmony_ci { 7546debc2cSopenharmony_ci MDnsServiceInfo serviceInfo; 7646debc2cSopenharmony_ci ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo); 7746debc2cSopenharmony_ci int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 7846debc2cSopenharmony_ci scanMDnsDiscoveryObserver.HandleServiceFound(serviceInfo, retCode); 7946debc2cSopenharmony_ci } 8046debc2cSopenharmony_ci 8146debc2cSopenharmony_ci void TestHandleResolveResult(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 8246debc2cSopenharmony_ci { 8346debc2cSopenharmony_ci MDnsServiceInfo serviceInfo; 8446debc2cSopenharmony_ci ScanMDnsResolveObserver scanMDnsResolveObserver = ScanMDnsResolveObserver(serviceInfo); 8546debc2cSopenharmony_ci int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 8646debc2cSopenharmony_ci scanMDnsResolveObserver.HandleResolveResult(serviceInfo, retCode); 8746debc2cSopenharmony_ci } 8846debc2cSopenharmony_ci 8946debc2cSopenharmony_ci void TestHandleStopDiscover(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 9046debc2cSopenharmony_ci { 9146debc2cSopenharmony_ci MDnsServiceInfo serviceInfo; 9246debc2cSopenharmony_ci ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo); 9346debc2cSopenharmony_ci int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 9446debc2cSopenharmony_ci scanMDnsDiscoveryObserver.HandleStopDiscover(serviceInfo, retCode); 9546debc2cSopenharmony_ci } 9646debc2cSopenharmony_ci 9746debc2cSopenharmony_ci} 9846debc2cSopenharmony_ci} 9946debc2cSopenharmony_ci 10046debc2cSopenharmony_ci/* Fuzzer entry point */ 10146debc2cSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 10246debc2cSopenharmony_ci{ 10346debc2cSopenharmony_ci if (data == nullptr) { 10446debc2cSopenharmony_ci return 0; 10546debc2cSopenharmony_ci } 10646debc2cSopenharmony_ci 10746debc2cSopenharmony_ci if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) { 10846debc2cSopenharmony_ci return 0; 10946debc2cSopenharmony_ci } 11046debc2cSopenharmony_ci FuzzedDataProvider dataProvider(data, size); 11146debc2cSopenharmony_ci OHOS::Scan::TestOnStartDiscoverService(data, size, &dataProvider); 11246debc2cSopenharmony_ci OHOS::Scan::TestGetServiceAttribute(data, size, &dataProvider); 11346debc2cSopenharmony_ci OHOS::Scan::TestonResolveService(data, size, &dataProvider); 11446debc2cSopenharmony_ci OHOS::Scan::TestToMDnsScaner(data, size, &dataProvider); 11546debc2cSopenharmony_ci OHOS::Scan::TestHandleServiceFound(data, size, &dataProvider); 11646debc2cSopenharmony_ci OHOS::Scan::TestHandleResolveResult(data, size, &dataProvider); 11746debc2cSopenharmony_ci OHOS::Scan::TestHandleStopDiscover(data, size, &dataProvider); 11846debc2cSopenharmony_ci return 0; 11946debc2cSopenharmony_ci} 12046debc2cSopenharmony_ci 121