From 1ec183bfef3c1815fe72c27045c03bcf224b54b2 Mon Sep 17 00:00:00 2001 From: Jvgang Date: Sun, 27 Jul 2025 23:33:16 +0000 Subject: [PATCH 1/3] reject SOURCE_TYPE_VIRTUAL_CAPTURE when create capturer Signed-off-by: Jvgang --- .../include/audio_capturer_private.h | 1 + .../audiocapturer/src/audio_capturer.cpp | 50 ++++++++++++------- .../src/audio_capturer_unit_test.cpp | 19 +++++++ 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/frameworks/native/audiocapturer/include/audio_capturer_private.h b/frameworks/native/audiocapturer/include/audio_capturer_private.h index 3f29d80d1a..d62592990d 100644 --- a/frameworks/native/audiocapturer/include/audio_capturer_private.h +++ b/frameworks/native/audiocapturer/include/audio_capturer_private.h @@ -106,6 +106,7 @@ public: void SetInterruptEventCallbackType(InterruptEventCallbackType callbackType) override; void RestoreAudioInLoop(bool &restoreResult, int32_t &tryCounter); + void HandleSetCapturerInfoByOptions(const AudioCapturerOptions &capturerOptions, const AppInfo &appInfo); std::shared_ptr audioStream_; AudioCapturerInfo capturerInfo_ = {}; diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index ee6a0bc9e4..5e57d78416 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -130,22 +130,46 @@ std::unique_ptr AudioCapturer::Create(const AudioCapturerOptions return std::make_unique(tempSharedPtr); } +void AudioCapturerPrivate::HandleSetCapturerInfoByOptions(const AudioCapturerOptions &capturerOptions, + const AppInfo &appInfo) +{ + capturerInfo_.sourceType = capturerOptions.capturerInfo.sourceType; + capturerInfo_.capturerFlags = capturerOptions.capturerInfo.capturerFlags; + capturerInfo_.originalFlag = ((capturerOptions.capturerInfo.sourceType == SOURCE_TYPE_VOICE_COMMUNICATION) + && (capturerOptions.capturerInfo.capturerFlags == AUDIO_FLAG_MMAP)) ? + AUDIO_FLAG_NORMAL : capturerOptions.capturerInfo.capturerFlags; + capturerInfo_.samplingRate = capturerOptions.streamInfo.samplingRate; + capturerInfo_.recorderType = capturerOptions.capturerInfo.recorderType; + capturerInfo_.isLoopback = capturerOptions.capturerInfo.isLoopback; + capturerInfo_.loopbackMode = capturerOptions.capturerInfo.loopbackMode; + // InitPlaybackCapturer will be replaced by UpdatePlaybackCaptureConfig. + filterConfig_ = capturerOptions.playbackCaptureConfig; + strategy_ = capturerOptions.strategy; +} + // LCOV_EXCL_START std::shared_ptr AudioCapturer::CreateCapturer(const AudioCapturerOptions &capturerOptions, const AppInfo &appInfo) { Trace trace("KeyAction AudioCapturer::Create"); auto sourceType = capturerOptions.capturerInfo.sourceType; - if (sourceType < SOURCE_TYPE_MIC || sourceType > SOURCE_TYPE_MAX || sourceType == AUDIO_SOURCE_TYPE_INVALID_5) { + + AUDIO_INFO_LOG("StreamClientState for Capturer::CreateCapturer sourceType:%{public}d, capturerFlags:%{public}d, " + "AppInfo:[%{public}d] [%{public}s] [%{public}s], ", sourceType, capturerOptions.capturerInfo.capturerFlags, + appInfo.appUid, appInfo.appTokenId == 0 ? "T" : "F", appInfo.appFullTokenId == 0 ? "T" : "F"); + + if (sourceType < SOURCE_TYPE_MIC || sourceType > SOURCE_TYPE_MAX + || sourceType == SOURCE_TYPE_VIRTUAL_CAPTURE || sourceType == AUDIO_SOURCE_TYPE_INVALID_5) { AudioCapturer::SendCapturerCreateError(sourceType, ERR_INVALID_PARAM); - AUDIO_ERR_LOG("Invalid source type %{public}d!", sourceType); + AUDIO_ERR_LOG("Invalid sourceType %{public}d!", sourceType); return nullptr; } if (sourceType == SOURCE_TYPE_ULTRASONIC && getuid() != UID_MSDP_SA) { AudioCapturer::SendCapturerCreateError(sourceType, ERR_INVALID_PARAM); + AUDIO_ERR_LOG("Create failed: SOURCE_TYPE_ULTRASONIC can only be used by MSDP"); + return nullptr; } - CHECK_AND_RETURN_RET_LOG(sourceType != SOURCE_TYPE_ULTRASONIC || getuid() == UID_MSDP_SA, nullptr, - "Create failed: SOURCE_TYPE_ULTRASONIC can only be used by MSDP"); + AudioStreamType audioStreamType = FindStreamTypeBySourceType(sourceType); AudioCapturerParams params; params.audioSampleFormat = capturerOptions.streamInfo.format; @@ -159,21 +183,9 @@ std::shared_ptr AudioCapturer::CreateCapturer(const AudioCapturer if (capturer == nullptr) { AudioCapturer::SendCapturerCreateError(sourceType, ERR_OPERATION_FAILED); AUDIO_ERR_LOG("Failed to create capturer object"); - return capturer; + return nullptr; } - AUDIO_INFO_LOG("Capturer sourceType: %{public}d, uid: %{public}d", sourceType, appInfo.appUid); - // InitPlaybackCapturer will be replaced by UpdatePlaybackCaptureConfig. - capturer->capturerInfo_.sourceType = sourceType; - capturer->capturerInfo_.capturerFlags = capturerOptions.capturerInfo.capturerFlags; - capturer->capturerInfo_.originalFlag = ((sourceType == SOURCE_TYPE_VOICE_COMMUNICATION) && - (capturerOptions.capturerInfo.capturerFlags == AUDIO_FLAG_MMAP)) ? - AUDIO_FLAG_NORMAL : capturerOptions.capturerInfo.capturerFlags; - capturer->capturerInfo_.samplingRate = capturerOptions.streamInfo.samplingRate; - capturer->capturerInfo_.recorderType = capturerOptions.capturerInfo.recorderType; - capturer->capturerInfo_.isLoopback = capturerOptions.capturerInfo.isLoopback; - capturer->capturerInfo_.loopbackMode = capturerOptions.capturerInfo.loopbackMode; - capturer->filterConfig_ = capturerOptions.playbackCaptureConfig; - capturer->strategy_ = capturerOptions.strategy; + capturer->HandleSetCapturerInfoByOptions(capturerOptions, appInfo); if (capturer->SetParams(params) != SUCCESS) { AudioCapturer::SendCapturerCreateError(sourceType, ERR_OPERATION_FAILED); capturer = nullptr; @@ -291,7 +303,7 @@ int32_t AudioCapturerPrivate::SetParams(const AudioCapturerParams params) uint32_t flag = AUDIO_INPUT_FLAG_NORMAL; int32_t ret = AudioPolicyManager::GetInstance().CreateCapturerClient( streamDesc, flag, audioStreamParams.originalSessionId); - CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateRendererClient failed"); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateCapturerClient failed"); AUDIO_INFO_LOG("StreamClientState for Capturer::CreateClient. id %{public}u, flag :%{public}u", audioStreamParams.originalSessionId, flag); diff --git a/frameworks/native/audiocapturer/test/unittest/capturer_test/src/audio_capturer_unit_test.cpp b/frameworks/native/audiocapturer/test/unittest/capturer_test/src/audio_capturer_unit_test.cpp index 98570b357a..2a4b500ed2 100644 --- a/frameworks/native/audiocapturer/test/unittest/capturer_test/src/audio_capturer_unit_test.cpp +++ b/frameworks/native/audiocapturer/test/unittest/capturer_test/src/audio_capturer_unit_test.cpp @@ -729,6 +729,25 @@ HWTEST(AudioCapturerUnitTest, Audio_Capturer_Create_028, TestSize.Level0) EXPECT_EQ(nullptr, audioCapturer); } +/** + * @tc.name : Test Create API via legal input. + * @tc.number: Audio_Capturer_Create_029 + * @tc.desc : Test Create capture with invalid sourceType + */ +HWTEST(AudioCapturerUnitTest, Audio_Capturer_Create_029, TestSize.Level0) +{ + AudioCapturerOptions capturerOptions; + capturerOptions.streamInfo.samplingRate = AudioSamplingRate::SAMPLE_RATE_16000; + capturerOptions.streamInfo.encoding = AudioEncodingType::ENCODING_PCM; + capturerOptions.streamInfo.format = AudioSampleFormat::SAMPLE_S16LE; + capturerOptions.streamInfo.channels = AudioChannel::MONO; + capturerOptions.capturerInfo.capturerFlags = CAPTURER_FLAG; + capturerOptions.capturerInfo.sourceType = static_cast(SOURCE_TYPE_VIRTUAL_CAPTURE); + + unique_ptr audioCapturer = AudioCapturer::Create(capturerOptions); + EXPECT_EQ(nullptr, audioCapturer); +} + #ifdef TEMP_DISABLE /** * @tc.name : Test SetParams API via legal input -- Gitee From f64a67726eee66f212874584f6cb96cb107f09c2 Mon Sep 17 00:00:00 2001 From: Jvgang Date: Mon, 28 Jul 2025 08:07:49 +0000 Subject: [PATCH 2/3] Reject SOURCE_TYPE_VIRTUAL_CAPTURE when create capturer Signed-off-by: Jvgang --- frameworks/native/audiocapturer/src/audio_capturer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index 5e57d78416..e229054b8d 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -135,8 +135,8 @@ void AudioCapturerPrivate::HandleSetCapturerInfoByOptions(const AudioCapturerOpt { capturerInfo_.sourceType = capturerOptions.capturerInfo.sourceType; capturerInfo_.capturerFlags = capturerOptions.capturerInfo.capturerFlags; - capturerInfo_.originalFlag = ((capturerOptions.capturerInfo.sourceType == SOURCE_TYPE_VOICE_COMMUNICATION) - && (capturerOptions.capturerInfo.capturerFlags == AUDIO_FLAG_MMAP)) ? + capturerInfo_.originalFlag = ((capturerOptions.capturerInfo.sourceType == SOURCE_TYPE_VOICE_COMMUNICATION) && + (capturerOptions.capturerInfo.capturerFlags == AUDIO_FLAG_MMAP)) ? AUDIO_FLAG_NORMAL : capturerOptions.capturerInfo.capturerFlags; capturerInfo_.samplingRate = capturerOptions.streamInfo.samplingRate; capturerInfo_.recorderType = capturerOptions.capturerInfo.recorderType; -- Gitee From e0f364dd46f39c7acf1dfe1f2739496f42e745c3 Mon Sep 17 00:00:00 2001 From: Jvgang Date: Fri, 8 Aug 2025 00:57:48 +0000 Subject: [PATCH 3/3] Reject SOURCE_TYPE_VIRTUAL_CAPTURE when create capturer Signed-off-by: Jvgang --- .../native/audiocapturer/src/audio_capturer.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index e229054b8d..20ff837f8b 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -154,12 +154,8 @@ std::shared_ptr AudioCapturer::CreateCapturer(const AudioCapturer Trace trace("KeyAction AudioCapturer::Create"); auto sourceType = capturerOptions.capturerInfo.sourceType; - AUDIO_INFO_LOG("StreamClientState for Capturer::CreateCapturer sourceType:%{public}d, capturerFlags:%{public}d, " - "AppInfo:[%{public}d] [%{public}s] [%{public}s], ", sourceType, capturerOptions.capturerInfo.capturerFlags, - appInfo.appUid, appInfo.appTokenId == 0 ? "T" : "F", appInfo.appFullTokenId == 0 ? "T" : "F"); - - if (sourceType < SOURCE_TYPE_MIC || sourceType > SOURCE_TYPE_MAX - || sourceType == SOURCE_TYPE_VIRTUAL_CAPTURE || sourceType == AUDIO_SOURCE_TYPE_INVALID_5) { + if (sourceType < SOURCE_TYPE_MIC || sourceType > SOURCE_TYPE_MAX || sourceType == SOURCE_TYPE_VIRTUAL_CAPTURE || + sourceType == AUDIO_SOURCE_TYPE_INVALID_5) { AudioCapturer::SendCapturerCreateError(sourceType, ERR_INVALID_PARAM); AUDIO_ERR_LOG("Invalid sourceType %{public}d!", sourceType); return nullptr; @@ -169,6 +165,10 @@ std::shared_ptr AudioCapturer::CreateCapturer(const AudioCapturer AUDIO_ERR_LOG("Create failed: SOURCE_TYPE_ULTRASONIC can only be used by MSDP"); return nullptr; } + + AUDIO_INFO_LOG("StreamClientState for Capturer::CreateCapturer sourceType:%{public}d, capturerFlags:%{public}d, " + "AppInfo:[%{public}d] [%{public}s] [%{public}s], ", sourceType, capturerOptions.capturerInfo.capturerFlags, + appInfo.appUid, appInfo.appTokenId == 0 ? "T" : "F", appInfo.appFullTokenId == 0 ? "T" : "F"); AudioStreamType audioStreamType = FindStreamTypeBySourceType(sourceType); AudioCapturerParams params; -- Gitee