/* * 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(); AudioCapturerInfo capturerInfo = {}; capturerInfo.sourceType = *reinterpret_cast(data); capturerInfo.capturerFlags = *reinterpret_cast(data); shared_ptr preferredInputCallbackFuzz = std::make_shared(); AudioRoutingManager::GetInstance()->GetPreferredInputDeviceForCapturerInfo(capturerInfo, desc); AudioRoutingManager::GetInstance()->SetPreferredInputDeviceChangeCallback(capturerInfo, preferredInputCallbackFuzz); AudioRoutingManager::GetInstance()->UnsetPreferredInputDeviceChangeCallback(); AudioRoutingManager::GetInstance()->GetAvailableMicrophones(); } 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); sptr deviceDescriptor = new AudioStandard::AudioDeviceDescriptor(); deviceDescriptor->deviceType_ = *reinterpret_cast(data); deviceDescriptor->deviceRole_ = *reinterpret_cast(data); AudioStreamManager::GetInstance()->GetHardwareOutputSamplingRate(deviceDescriptor); AudioStreamInfo audioStreamInfo = {}; audioStreamInfo.samplingRate = *reinterpret_cast(data); audioStreamInfo.channels = *reinterpret_cast(data); audioStreamInfo.format = *reinterpret_cast(data); audioStreamInfo.encoding = *reinterpret_cast(data); AudioStreamManager::GetInstance()->IsAudioRendererLowLatencySupported(audioStreamInfo); AudioVolumeType volumeType = *reinterpret_cast(data); AudioStreamManager::GetInstance()->IsStreamActive(volumeType); } 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); int32_t clientld = *reinterpret_cast(data); int32_t deviceId = *reinterpret_cast(data); AudioRingerMode ringMode = *reinterpret_cast(data); shared_ptr ringerModeCallbackFuzz = std::make_shared(); 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); audioGroupMngr_->GetMaxAmplitude(deviceId); audioGroupMngr_->SetRingerMode(ringMode); audioGroupMngr_->GetRingerMode(); audioGroupMngr_->IsMicrophoneMute(); audioGroupMngr_->SetRingerModeCallback(clientld, ringerModeCallbackFuzz); audioGroupMngr_->UnsetRingerModeCallback(clientld); } } // 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; }