/* * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "audio_errors.h" #include "audio_info.h" #include "audio_system_manager.h" #include "audio_routing_manager.h" #include "audio_stream_manager.h" #include "audio_manager_fuzzer.h" using namespace std; namespace OHOS { namespace AudioStandard { namespace { std::string g_networkId = "LocalDevice"; } void AudioRendererStateCallbackFuzz::OnRendererStateChange( const std::vector> &audioRendererChangeInfos) {} void AudioCapturerStateCallbackFuzz::OnCapturerStateChange( const std::vector> &audioCapturerChangeInfos) {} const int32_t LIMITSIZE = 4; void AudioManagerFuzzTest(const uint8_t* data, size_t size) { if ((data == nullptr) || (size < LIMITSIZE)) { return; } AudioVolumeType type = *reinterpret_cast(data); int32_t volume = *reinterpret_cast(data); AudioSystemManager::GetInstance()->SetVolume(type, volume); AudioSystemManager::GetInstance()->GetVolume(type); AudioSystemManager::GetInstance()->GetMinVolume(type); AudioSystemManager::GetInstance()->GetMaxVolume(type); AudioSystemManager::GetInstance()->SetMute(type, true); AudioSystemManager::GetInstance()->IsStreamMute(type); AudioSystemManager::GetInstance()->SetRingerMode(*reinterpret_cast(data)); AudioSystemManager::GetInstance()->SetAudioScene(*reinterpret_cast(data)); std::string key(reinterpret_cast(data), size); std::string value(reinterpret_cast(data), size); AudioSystemManager::GetInstance()->SetAudioParameter(key, value); std::list> focusInfoList = {}; std::pair focusInfo = {}; focusInfo.first.streamUsage = *reinterpret_cast(data); focusInfo.first.contentType = *reinterpret_cast(data); focusInfo.first.audioFocusType.streamType = *reinterpret_cast(data); focusInfo.first.audioFocusType.sourceType = *reinterpret_cast(data); focusInfo.first.audioFocusType.isPlay = *reinterpret_cast(data); focusInfo.first.sessionID = *reinterpret_cast(data); focusInfo.first.pauseWhenDucked = *reinterpret_cast(data); focusInfo.first.pid = *reinterpret_cast(data); focusInfo.first.mode = *reinterpret_cast(data); focusInfo.second = *reinterpret_cast(data); focusInfoList.push_back(focusInfo); AudioSystemManager::GetInstance()->GetAudioFocusInfoList(focusInfoList); shared_ptr focusInfoChangeCallbackFuzz = std::make_shared(); AudioSystemManager::GetInstance()->RegisterFocusInfoChangeCallback(focusInfoChangeCallbackFuzz); AudioSystemManager::GetInstance()->UnregisterFocusInfoChangeCallback(); } void AudioRoutingManagerFuzzTest(const uint8_t* data, size_t size) { if ((data == nullptr) || (size < LIMITSIZE)) { return; } AudioRendererInfo rendererInfo = {}; rendererInfo.contentType = *reinterpret_cast(data); rendererInfo.streamUsage = *reinterpret_cast(data); rendererInfo.rendererFlags = *reinterpret_cast(data); std::vector> desc; shared_ptr preferredOutputCallbackFuzz = std::make_shared(); AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(rendererInfo, desc); AudioRoutingManager::GetInstance()->SetPreferredOutputDeviceChangeCallback(rendererInfo, preferredOutputCallbackFuzz); AudioRoutingManager::GetInstance()->UnsetPreferredOutputDeviceChangeCallback(); } void AudioStreamManagerFuzzTest(const uint8_t* data, size_t size) { if ((data == nullptr) || (size < LIMITSIZE)) { return; } int32_t clientPid = *reinterpret_cast(data); shared_ptr audioRendererStateCallbackFuzz = std::make_shared(); shared_ptr audioCapturerStateCallbackFuzz = std::make_shared(); AudioStreamManager::GetInstance()->RegisterAudioRendererEventListener(clientPid, audioRendererStateCallbackFuzz); AudioStreamManager::GetInstance()->UnregisterAudioRendererEventListener(clientPid); AudioStreamManager::GetInstance()->RegisterAudioCapturerEventListener(clientPid, audioCapturerStateCallbackFuzz); AudioStreamManager::GetInstance()->UnregisterAudioCapturerEventListener(clientPid); std::vector> audioRendererChangeInfos; AudioStreamManager::GetInstance()->GetCurrentRendererChangeInfos(audioRendererChangeInfos); std::vector> audioCapturerChangeInfos; AudioStreamManager::GetInstance()->GetCurrentCapturerChangeInfos(audioCapturerChangeInfos); } void AudioGroupManagerFuzzTest(const uint8_t* data, size_t size) { if ((data == nullptr) || (size < LIMITSIZE)) { return; } int32_t volume = *reinterpret_cast(data); AudioVolumeType type = *reinterpret_cast(data); VolumeAdjustType adjustType = *reinterpret_cast(data); DeviceType device = *reinterpret_cast(data); std::vector> infos; AudioSystemManager::GetInstance()->GetVolumeGroups(g_networkId, infos); if (infos.empty() || infos[0] == nullptr) { return; } int32_t groupId = infos[0]->volumeGroupId_; auto audioGroupMngr_ = AudioSystemManager::GetInstance()->GetGroupManager(groupId); audioGroupMngr_->IsVolumeUnadjustable(); audioGroupMngr_->AdjustVolumeByStep(adjustType); audioGroupMngr_->AdjustSystemVolumeByStep(type, adjustType); audioGroupMngr_->GetSystemVolumeInDb(type, volume, device); } } // namespace AudioStandard } // namesapce OHOS /* Fuzzer entry point */ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { /* Run your code on data */ OHOS::AudioStandard::AudioManagerFuzzTest(data, size); OHOS::AudioStandard::AudioRoutingManagerFuzzTest(data, size); OHOS::AudioStandard::AudioStreamManagerFuzzTest(data, size); OHOS::AudioStandard::AudioGroupManagerFuzzTest(data, size); return 0; }