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#include "fuzzer/FuzzedDataProvider.h" 1646debc2cSopenharmony_ci#include "scan_manager_client.h" 1746debc2cSopenharmony_ci#include "scan_callback.h" 1846debc2cSopenharmony_ci#include "scanner_info.h" 1946debc2cSopenharmony_ci#include "scanmanagerclient_fuzzer.h" 2046debc2cSopenharmony_ci 2146debc2cSopenharmony_cinamespace OHOS::Scan { 2246debc2cSopenharmony_ciconstexpr uint8_t MAX_STRING_LENGTH = 255; 2346debc2cSopenharmony_ciconstexpr int MAX_SET_NUMBER = 100; 2446debc2cSopenharmony_ciconstexpr size_t FOO_MAX_LEN = 1024; 2546debc2cSopenharmony_ciconstexpr size_t U32_AT_SIZE = 4; 2646debc2cSopenharmony_ci 2746debc2cSopenharmony_civoid TestGetScannerList(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 2846debc2cSopenharmony_ci{ 2946debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 3046debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 3146debc2cSopenharmony_ci return; 3246debc2cSopenharmony_ci } 3346debc2cSopenharmony_ci int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 3446debc2cSopenharmony_ci scanManagerPtr->InitScan(scanVersion); 3546debc2cSopenharmony_ci scanManagerPtr->GetScannerList(); 3646debc2cSopenharmony_ci scanManagerPtr->ExitScan(); 3746debc2cSopenharmony_ci} 3846debc2cSopenharmony_ci 3946debc2cSopenharmony_civoid TestStopDiscover(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 4046debc2cSopenharmony_ci{ 4146debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 4246debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 4346debc2cSopenharmony_ci return; 4446debc2cSopenharmony_ci } 4546debc2cSopenharmony_ci int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 4646debc2cSopenharmony_ci scanManagerPtr->InitScan(scanVersion); 4746debc2cSopenharmony_ci scanManagerPtr->StopDiscover(); 4846debc2cSopenharmony_ci scanManagerPtr->ExitScan(); 4946debc2cSopenharmony_ci} 5046debc2cSopenharmony_ci 5146debc2cSopenharmony_civoid TestGetScanOptionDesc(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 5246debc2cSopenharmony_ci{ 5346debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 5446debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 5546debc2cSopenharmony_ci return; 5646debc2cSopenharmony_ci } 5746debc2cSopenharmony_ci int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 5846debc2cSopenharmony_ci scanManagerPtr->InitScan(scanVersion); 5946debc2cSopenharmony_ci std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 6046debc2cSopenharmony_ci int32_t optionIndex = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 6146debc2cSopenharmony_ci ScanOptionDescriptor desc; 6246debc2cSopenharmony_ci scanManagerPtr->OpenScanner(scannerId); 6346debc2cSopenharmony_ci scanManagerPtr->GetScanOptionDesc(scannerId, optionIndex, desc); 6446debc2cSopenharmony_ci scanManagerPtr->CloseScanner(scannerId); 6546debc2cSopenharmony_ci scanManagerPtr->ExitScan(); 6646debc2cSopenharmony_ci} 6746debc2cSopenharmony_ci 6846debc2cSopenharmony_civoid TestOpScanOptionValue(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 6946debc2cSopenharmony_ci{ 7046debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 7146debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 7246debc2cSopenharmony_ci return; 7346debc2cSopenharmony_ci } 7446debc2cSopenharmony_ci int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 7546debc2cSopenharmony_ci scanManagerPtr->InitScan(scanVersion); 7646debc2cSopenharmony_ci std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 7746debc2cSopenharmony_ci int32_t optionIndex = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 7846debc2cSopenharmony_ci auto op = static_cast<ScanOptionOpType>(dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER)); 7946debc2cSopenharmony_ci int32_t info = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 8046debc2cSopenharmony_ci ScanOptionValue value; 8146debc2cSopenharmony_ci scanManagerPtr->OpenScanner(scannerId); 8246debc2cSopenharmony_ci scanManagerPtr->OpScanOptionValue(scannerId, optionIndex, op, value, info); 8346debc2cSopenharmony_ci scanManagerPtr->CloseScanner(scannerId); 8446debc2cSopenharmony_ci scanManagerPtr->ExitScan(); 8546debc2cSopenharmony_ci} 8646debc2cSopenharmony_ci 8746debc2cSopenharmony_civoid TestGetScanParameters(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 8846debc2cSopenharmony_ci{ 8946debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 9046debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 9146debc2cSopenharmony_ci return; 9246debc2cSopenharmony_ci } 9346debc2cSopenharmony_ci int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 9446debc2cSopenharmony_ci scanManagerPtr->InitScan(scanVersion); 9546debc2cSopenharmony_ci std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 9646debc2cSopenharmony_ci ScanParameters para; 9746debc2cSopenharmony_ci scanManagerPtr->OpenScanner(scannerId); 9846debc2cSopenharmony_ci scanManagerPtr->GetScanParameters(scannerId, para); 9946debc2cSopenharmony_ci scanManagerPtr->CloseScanner(scannerId); 10046debc2cSopenharmony_ci scanManagerPtr->ExitScan(); 10146debc2cSopenharmony_ci} 10246debc2cSopenharmony_ci 10346debc2cSopenharmony_civoid TestStartScan(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 10446debc2cSopenharmony_ci{ 10546debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 10646debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 10746debc2cSopenharmony_ci return; 10846debc2cSopenharmony_ci } 10946debc2cSopenharmony_ci int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 11046debc2cSopenharmony_ci scanManagerPtr->InitScan(scanVersion); 11146debc2cSopenharmony_ci std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 11246debc2cSopenharmony_ci bool batchMode = dataProvider->ConsumeBool(); 11346debc2cSopenharmony_ci scanManagerPtr->OpenScanner(scannerId); 11446debc2cSopenharmony_ci scanManagerPtr->StartScan(scannerId, batchMode); 11546debc2cSopenharmony_ci scanManagerPtr->CancelScan(scannerId); 11646debc2cSopenharmony_ci scanManagerPtr->CloseScanner(scannerId); 11746debc2cSopenharmony_ci scanManagerPtr->ExitScan(); 11846debc2cSopenharmony_ci} 11946debc2cSopenharmony_ci 12046debc2cSopenharmony_civoid TestGetSingleFrameFD(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 12146debc2cSopenharmony_ci{ 12246debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 12346debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 12446debc2cSopenharmony_ci return; 12546debc2cSopenharmony_ci } 12646debc2cSopenharmony_ci int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 12746debc2cSopenharmony_ci scanManagerPtr->InitScan(scanVersion); 12846debc2cSopenharmony_ci std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 12946debc2cSopenharmony_ci uint32_t dataSize = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER); 13046debc2cSopenharmony_ci uint32_t fd = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER); 13146debc2cSopenharmony_ci scanManagerPtr->GetSingleFrameFD(scannerId, dataSize, fd); 13246debc2cSopenharmony_ci scanManagerPtr->ExitScan(); 13346debc2cSopenharmony_ci} 13446debc2cSopenharmony_ci 13546debc2cSopenharmony_civoid TestSetScanIOMode(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 13646debc2cSopenharmony_ci{ 13746debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 13846debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 13946debc2cSopenharmony_ci return; 14046debc2cSopenharmony_ci } 14146debc2cSopenharmony_ci std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 14246debc2cSopenharmony_ci bool batchMode = dataProvider->ConsumeBool(); 14346debc2cSopenharmony_ci scanManagerPtr->OpenScanner(scannerId); 14446debc2cSopenharmony_ci scanManagerPtr->SetScanIOMode(scannerId, batchMode); 14546debc2cSopenharmony_ci scanManagerPtr->CloseScanner(scannerId); 14646debc2cSopenharmony_ci} 14746debc2cSopenharmony_ci 14846debc2cSopenharmony_civoid TestGetScanSelectFd(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 14946debc2cSopenharmony_ci{ 15046debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 15146debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 15246debc2cSopenharmony_ci return; 15346debc2cSopenharmony_ci } 15446debc2cSopenharmony_ci std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 15546debc2cSopenharmony_ci int32_t fd = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 15646debc2cSopenharmony_ci scanManagerPtr->OpenScanner(scannerId); 15746debc2cSopenharmony_ci scanManagerPtr->GetScanSelectFd(scannerId, fd); 15846debc2cSopenharmony_ci scanManagerPtr->CloseScanner(scannerId); 15946debc2cSopenharmony_ci} 16046debc2cSopenharmony_ci 16146debc2cSopenharmony_civoid TestOn(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 16246debc2cSopenharmony_ci{ 16346debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 16446debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 16546debc2cSopenharmony_ci return; 16646debc2cSopenharmony_ci } 16746debc2cSopenharmony_ci std::string taskId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 16846debc2cSopenharmony_ci std::string type = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 16946debc2cSopenharmony_ci std::function<void(std::vector<ScanDeviceInfo> &infos)> callbackFunction; 17046debc2cSopenharmony_ci sptr<IScanCallback> listener = new (std::nothrow) ScanCallback(callbackFunction); 17146debc2cSopenharmony_ci if (listener == nullptr) { 17246debc2cSopenharmony_ci return; 17346debc2cSopenharmony_ci } 17446debc2cSopenharmony_ci scanManagerPtr->On(taskId, type, listener); 17546debc2cSopenharmony_ci} 17646debc2cSopenharmony_ci 17746debc2cSopenharmony_civoid TestOff(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 17846debc2cSopenharmony_ci{ 17946debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 18046debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 18146debc2cSopenharmony_ci return; 18246debc2cSopenharmony_ci } 18346debc2cSopenharmony_ci std::string taskId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 18446debc2cSopenharmony_ci std::string type = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 18546debc2cSopenharmony_ci scanManagerPtr->Off(taskId, type); 18646debc2cSopenharmony_ci} 18746debc2cSopenharmony_ci 18846debc2cSopenharmony_civoid TestGetScannerState(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 18946debc2cSopenharmony_ci{ 19046debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 19146debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 19246debc2cSopenharmony_ci return; 19346debc2cSopenharmony_ci } 19446debc2cSopenharmony_ci int32_t scannerState = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 19546debc2cSopenharmony_ci scanManagerPtr->GetScannerState(scannerState); 19646debc2cSopenharmony_ci} 19746debc2cSopenharmony_ci 19846debc2cSopenharmony_civoid TestGetScanProgress(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 19946debc2cSopenharmony_ci{ 20046debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 20146debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 20246debc2cSopenharmony_ci return; 20346debc2cSopenharmony_ci } 20446debc2cSopenharmony_ci std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 20546debc2cSopenharmony_ci ScanProgress prog; 20646debc2cSopenharmony_ci scanManagerPtr->GetScanProgress(scannerId, prog); 20746debc2cSopenharmony_ci} 20846debc2cSopenharmony_ci 20946debc2cSopenharmony_civoid TestAddScanner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 21046debc2cSopenharmony_ci{ 21146debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 21246debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 21346debc2cSopenharmony_ci return; 21446debc2cSopenharmony_ci } 21546debc2cSopenharmony_ci std::string serialNumber = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 21646debc2cSopenharmony_ci std::string discoverMode = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 21746debc2cSopenharmony_ci scanManagerPtr->AddScanner(serialNumber, discoverMode); 21846debc2cSopenharmony_ci} 21946debc2cSopenharmony_ci 22046debc2cSopenharmony_civoid TestDeleteScanner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 22146debc2cSopenharmony_ci{ 22246debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 22346debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 22446debc2cSopenharmony_ci return; 22546debc2cSopenharmony_ci } 22646debc2cSopenharmony_ci std::string serialNumber = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 22746debc2cSopenharmony_ci std::string discoverMode = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 22846debc2cSopenharmony_ci scanManagerPtr->DeleteScanner(serialNumber, discoverMode); 22946debc2cSopenharmony_ci} 23046debc2cSopenharmony_ci 23146debc2cSopenharmony_civoid TestGetAddedScanner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 23246debc2cSopenharmony_ci{ 23346debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 23446debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 23546debc2cSopenharmony_ci return; 23646debc2cSopenharmony_ci } 23746debc2cSopenharmony_ci int32_t count = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 23846debc2cSopenharmony_ci std::vector<ScanDeviceInfo> allAddedScanner(count); 23946debc2cSopenharmony_ci scanManagerPtr->GetAddedScanner(allAddedScanner); 24046debc2cSopenharmony_ci} 24146debc2cSopenharmony_ci 24246debc2cSopenharmony_civoid TestUpdateScannerName(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 24346debc2cSopenharmony_ci{ 24446debc2cSopenharmony_ci auto scanManagerPtr = ScanManagerClient::GetInstance(); 24546debc2cSopenharmony_ci if (scanManagerPtr == nullptr) { 24646debc2cSopenharmony_ci return; 24746debc2cSopenharmony_ci } 24846debc2cSopenharmony_ci std::string serialNumber = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 24946debc2cSopenharmony_ci std::string discoverMode = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 25046debc2cSopenharmony_ci std::string deviceName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 25146debc2cSopenharmony_ci scanManagerPtr->UpdateScannerName(serialNumber, discoverMode, deviceName); 25246debc2cSopenharmony_ci} 25346debc2cSopenharmony_ci 25446debc2cSopenharmony_ci} 25546debc2cSopenharmony_ci 25646debc2cSopenharmony_ci/* Fuzzer entry point */ 25746debc2cSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 25846debc2cSopenharmony_ci{ 25946debc2cSopenharmony_ci if (data == nullptr) { 26046debc2cSopenharmony_ci return 0; 26146debc2cSopenharmony_ci } 26246debc2cSopenharmony_ci 26346debc2cSopenharmony_ci if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) { 26446debc2cSopenharmony_ci return 0; 26546debc2cSopenharmony_ci } 26646debc2cSopenharmony_ci FuzzedDataProvider dataProvider(data, size); 26746debc2cSopenharmony_ci OHOS::Scan::TestGetScannerList(data, size, &dataProvider); 26846debc2cSopenharmony_ci OHOS::Scan::TestStopDiscover(data, size, &dataProvider); 26946debc2cSopenharmony_ci OHOS::Scan::TestGetScanOptionDesc(data, size, &dataProvider); 27046debc2cSopenharmony_ci OHOS::Scan::TestOpScanOptionValue(data, size, &dataProvider); 27146debc2cSopenharmony_ci OHOS::Scan::TestGetScanParameters(data, size, &dataProvider); 27246debc2cSopenharmony_ci OHOS::Scan::TestStartScan(data, size, &dataProvider); 27346debc2cSopenharmony_ci OHOS::Scan::TestGetSingleFrameFD(data, size, &dataProvider); 27446debc2cSopenharmony_ci OHOS::Scan::TestSetScanIOMode(data, size, &dataProvider); 27546debc2cSopenharmony_ci OHOS::Scan::TestGetScanSelectFd(data, size, &dataProvider); 27646debc2cSopenharmony_ci OHOS::Scan::TestOn(data, size, &dataProvider); 27746debc2cSopenharmony_ci OHOS::Scan::TestOff(data, size, &dataProvider); 27846debc2cSopenharmony_ci OHOS::Scan::TestGetScannerState(data, size, &dataProvider); 27946debc2cSopenharmony_ci OHOS::Scan::TestGetScanProgress(data, size, &dataProvider); 28046debc2cSopenharmony_ci OHOS::Scan::TestAddScanner(data, size, &dataProvider); 28146debc2cSopenharmony_ci OHOS::Scan::TestDeleteScanner(data, size, &dataProvider); 28246debc2cSopenharmony_ci OHOS::Scan::TestGetAddedScanner(data, size, &dataProvider); 28346debc2cSopenharmony_ci OHOS::Scan::TestUpdateScannerName(data, size, &dataProvider); 28446debc2cSopenharmony_ci 28546debc2cSopenharmony_ci return 0; 28646debc2cSopenharmony_ci} 28746debc2cSopenharmony_ci 288