diff --git a/common/dfx_utils/test/unittest/src/daudio_hidumper_test.cpp b/common/dfx_utils/test/unittest/src/daudio_hidumper_test.cpp index 1ae602bf28713b7db6c3efbc3a6f9e38db88a654..38cd4aef38af51b315d946a9dcd770b07c77c8b9 100644 --- a/common/dfx_utils/test/unittest/src/daudio_hidumper_test.cpp +++ b/common/dfx_utils/test/unittest/src/daudio_hidumper_test.cpp @@ -87,7 +87,7 @@ HWTEST_F(DAudioHidumperTest, GetSinkInfo_001, TestSize.Level1) return; } std::string result = "123"; - EXPECT_NE(HDF_SUCCESS, hidumper_->GetSinkInfo(result)); + EXPECT_EQ(HDF_SUCCESS, hidumper_->GetSinkInfo(result)); } /** diff --git a/services/audiomanager/managersource/include/dmic_dev.h b/services/audiomanager/managersource/include/dmic_dev.h index 9f3fb18f10fea300b3694ed9e368ea3e3ffc7a13..0bfd1a84d19f94e9618cfef69e92197d0aac9cb9 100644 --- a/services/audiomanager/managersource/include/dmic_dev.h +++ b/services/audiomanager/managersource/include/dmic_dev.h @@ -100,6 +100,7 @@ private: static constexpr const char* ENQUEUE_THREAD = "micEnqueueTh"; const std::string DUMP_DAUDIO_MIC_READ_FROM_BUF_NAME = "dump_source_mic_read_from_trans.pcm"; const std::string DUMP_DAUDIO_LOWLATENCY_MIC_FROM_BUF_NAME = "dump_source_mic_write_to_ashmem.pcm"; + const int32_t ASHMEM_MAX_LEN = 2 * 4096; std::weak_ptr audioEventCallback_; std::mutex dataQueueMtx_; diff --git a/services/audiomanager/managersource/include/dspeaker_dev.h b/services/audiomanager/managersource/include/dspeaker_dev.h index f812a0c346847ef76dbe70afcc8a82a53d53560a..973ee699e4b87597454ab2d5e20f990c32959711 100644 --- a/services/audiomanager/managersource/include/dspeaker_dev.h +++ b/services/audiomanager/managersource/include/dspeaker_dev.h @@ -86,6 +86,7 @@ private: static constexpr const char* ENQUEUE_THREAD = "spkEnqueueTh"; const std::string SPK_DEV_FILENAME = "dump_source_spk_write_to_trans.pcm"; const std::string SPK_LOWLATENCY_FILENAME = "dump_source_spk_fast_read_from_ashmem.pcm"; + const int32_t ASHMEM_MAX_LEN = 2 * 4096; std::weak_ptr audioEventCallback_; std::mutex channelWaitMutex_; diff --git a/services/audiomanager/managersource/src/daudio_source_dev.cpp b/services/audiomanager/managersource/src/daudio_source_dev.cpp index 3ac7779d92038028622ebfe1dc21d9b2e3c2e5c0..1891eb433fdcc797eeafd1a6df32c7bf69f9ecb4 100644 --- a/services/audiomanager/managersource/src/daudio_source_dev.cpp +++ b/services/audiomanager/managersource/src/daudio_source_dev.cpp @@ -196,8 +196,12 @@ int32_t DAudioSourceDev::DisableDAudio(const std::string &dhId) CHECK_NULL_FREE_RETURN(data, ERR_DH_AUDIO_NULLPTR, jParamClose); AudioEvent event(AudioEventType::EVENT_UNKNOWN, std::string(data)); int32_t dhIdNum = ConvertString2Int(dhId); - CHECK_AND_FREECHAR_RETURN_RET_LOG(dhIdNum == ERR_DH_AUDIO_FAILED, ERR_DH_AUDIO_NOT_SUPPORT, data, - "%{public}s", "Parse dhId error."); + if (dhIdNum == ERR_DH_AUDIO_FAILED) { + DHLOGE("Parse dhId error."); + cJSON_Delete(jParamClose); + cJSON_free(data); + return ERR_DH_AUDIO_NOT_SUPPORT; + } switch (GetDevTypeByDHId(dhIdNum)) { case AUDIO_DEVICE_TYPE_SPEAKER: event.type = CLOSE_SPEAKER; diff --git a/services/audiomanager/managersource/src/dmic_dev.cpp b/services/audiomanager/managersource/src/dmic_dev.cpp index 142ff4db11d2fb9e7d7123293fc94f314bec554e..6eba16abe2660877664c31377dfacc4dc6a559fe 100644 --- a/services/audiomanager/managersource/src/dmic_dev.cpp +++ b/services/audiomanager/managersource/src/dmic_dev.cpp @@ -408,15 +408,17 @@ int32_t DMicDev::RefreshAshmemInfo(const int32_t streamId, if (ashmem_ != nullptr) { return DH_SUCCESS; } - ashmem_ = new Ashmem(fd, ashmemLength); - ashmemLength_ = ashmemLength; - lengthPerTrans_ = lengthPerTrans; - DHLOGD("Create ashmem success. fd:%{public}d, ashmem length: %{public}d, lengthPreTrans: %{public}d", - fd, ashmemLength_, lengthPerTrans_); - bool mapRet = ashmem_->MapReadAndWriteAshmem(); - if (!mapRet) { - DHLOGE("Mmap ashmem failed."); - return ERR_DH_AUDIO_NULLPTR; + if (ashmemLength < ASHMEM_MAX_LEN) { + ashmem_ = sptr(new Ashmem(fd, ashmemLength)); + ashmemLength_ = ashmemLength; + lengthPerTrans_ = lengthPerTrans; + DHLOGD("Create ashmem success. fd:%{public}d, ashmem length: %{public}d, lengthPreTrans: %{public}d", + fd, ashmemLength_, lengthPerTrans_); + bool mapRet = ashmem_->MapReadAndWriteAshmem(); + if (!mapRet) { + DHLOGE("Mmap ashmem failed."); + return ERR_DH_AUDIO_NULLPTR; + } } } return DH_SUCCESS; diff --git a/services/audiomanager/managersource/src/dspeaker_dev.cpp b/services/audiomanager/managersource/src/dspeaker_dev.cpp index 00a7e95608c1fecf8bfce4fa1ea8104453831b62..1747dc9cf9756288a28a43b3c6a3a2adf1d650c2 100644 --- a/services/audiomanager/managersource/src/dspeaker_dev.cpp +++ b/services/audiomanager/managersource/src/dspeaker_dev.cpp @@ -337,15 +337,17 @@ int32_t DSpeakerDev::RefreshAshmemInfo(const int32_t streamId, if (ashmem_ != nullptr) { return DH_SUCCESS; } - ashmem_ = new Ashmem(fd, ashmemLength); - ashmemLength_ = ashmemLength; - lengthPerTrans_ = lengthPerTrans; - DHLOGI("Create ashmem success. fd:%{public}d, ashmem length: %{public}d, lengthPreTrans: %{public}d", - fd, ashmemLength_, lengthPerTrans_); - bool mapRet = ashmem_->MapReadAndWriteAshmem(); - if (!mapRet) { - DHLOGE("Mmap ashmem failed."); - return ERR_DH_AUDIO_NULLPTR; + if (ashmemLength < ASHMEM_MAX_LEN) { + ashmem_ = sptr(new Ashmem(fd, ashmemLength)); + ashmemLength_ = ashmemLength; + lengthPerTrans_ = lengthPerTrans; + DHLOGI("Create ashmem success. fd:%{public}d, ashmem length: %{public}d, lengthPreTrans: %{public}d", + fd, ashmemLength_, lengthPerTrans_); + bool mapRet = ashmem_->MapReadAndWriteAshmem(); + if (!mapRet) { + DHLOGE("Mmap ashmem failed."); + return ERR_DH_AUDIO_NULLPTR; + } } } return DH_SUCCESS; diff --git a/services/audiomanager/servicesink/include/daudio_sink_hidumper.h b/services/audiomanager/servicesink/include/daudio_sink_hidumper.h index 3caad3901aa8c318cfb9f82d789aa2321a664428..fdc48b40481fa779c8d864e68b90531540246bc3 100644 --- a/services/audiomanager/servicesink/include/daudio_sink_hidumper.h +++ b/services/audiomanager/servicesink/include/daudio_sink_hidumper.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2023-2024 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 @@ -50,6 +50,7 @@ private: private: bool dumpAudioDataFlag_ = false; + const int32_t DUMP_MAX_SIZE = 10 * 1024; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audiomanager/servicesink/src/daudio_sink_hidumper.cpp b/services/audiomanager/servicesink/src/daudio_sink_hidumper.cpp index f2a2bdd86dc5e7492eea070c781e7d18b3ddb59c..4302013281daeddc9cd3c4e30a25176030452834 100644 --- a/services/audiomanager/servicesink/src/daudio_sink_hidumper.cpp +++ b/services/audiomanager/servicesink/src/daudio_sink_hidumper.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2023-2024 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 @@ -55,6 +55,10 @@ bool DaudioSinkHidumper::Dump(const std::vector &args, std::string { result.clear(); int32_t argsSize = static_cast(args.size()); + if (argsSize > DUMP_MAX_SIZE) { + DHLOGE("Dump input is invalid"); + return false; + } DHLOGI("Distributed audio hidumper dump args.size():%{public}d", argsSize); for (int32_t i = 0; i < argsSize; i++) { DHLOGI("Distributed audio hidumper dump args[%{public}d]: %{public}s.", i, args.at(i).c_str()); diff --git a/services/audiomanager/test/fuzztest/sinkserviceinitsink_fuzzer/sinkserviceinitsink_fuzzer.cpp b/services/audiomanager/test/fuzztest/sinkserviceinitsink_fuzzer/sinkserviceinitsink_fuzzer.cpp index 5530f22b9676b53fbf5f8d4b141a95f56f11a171..296be25828a3ef2aff1d95e33c3d6adf0820df27 100644 --- a/services/audiomanager/test/fuzztest/sinkserviceinitsink_fuzzer/sinkserviceinitsink_fuzzer.cpp +++ b/services/audiomanager/test/fuzztest/sinkserviceinitsink_fuzzer/sinkserviceinitsink_fuzzer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2023-2024 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 @@ -36,7 +36,7 @@ void SinkServiceInitSinkFuzzTest(const uint8_t* data, size_t size) bool runOnCreate = *(reinterpret_cast(data)); auto dAudioSinkService = std::make_shared(saId, runOnCreate); - sptr dAudioSinkIpcCallback = new DAudioSinkIpcCallback(); + sptr dAudioSinkIpcCallback(new DAudioSinkIpcCallback()); dAudioSinkService->InitSink(params, dAudioSinkIpcCallback); } diff --git a/services/audiomanager/test/fuzztest/sourceserviceinitsource_fuzzer/sourceserviceinitsource_fuzzer.cpp b/services/audiomanager/test/fuzztest/sourceserviceinitsource_fuzzer/sourceserviceinitsource_fuzzer.cpp index a1e73daf5c15c29776541cd20aa96d214bea3d48..0fb9d40add5fd77420d46b0bb8531bb0772ad512 100644 --- a/services/audiomanager/test/fuzztest/sourceserviceinitsource_fuzzer/sourceserviceinitsource_fuzzer.cpp +++ b/services/audiomanager/test/fuzztest/sourceserviceinitsource_fuzzer/sourceserviceinitsource_fuzzer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2023-2024 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 @@ -36,7 +36,7 @@ void SourceServiceInitSourceFuzzTest(const uint8_t* data, size_t size) bool runOnCreate = *(reinterpret_cast(data)); auto dAudioSourceService = std::make_shared(saId, runOnCreate); - sptr callback = new DAudioIpcCallback(); + sptr callback(new DAudioIpcCallback()); dAudioSourceService->InitSource(params, callback); } } diff --git a/services/audiomanager/test/unittest/sourcedevice/src/dmic_dev_test.cpp b/services/audiomanager/test/unittest/sourcedevice/src/dmic_dev_test.cpp index 8ae4184751093b09b2ada6621d2335e58d027ba8..7e157abb87802ce5a36e64192ff50a7babddda63 100644 --- a/services/audiomanager/test/unittest/sourcedevice/src/dmic_dev_test.cpp +++ b/services/audiomanager/test/unittest/sourcedevice/src/dmic_dev_test.cpp @@ -200,6 +200,7 @@ HWTEST_F(DMicDevTest, Start_001, TestSize.Level1) EXPECT_EQ(DH_SUCCESS, mic_->SetUp()); mic_->isTransReady_.store(true); EXPECT_EQ(DH_SUCCESS, mic_->Start()); + mic_->isOpened_.store(true); EXPECT_TRUE(mic_->IsOpened()); } @@ -222,6 +223,7 @@ HWTEST_F(DMicDevTest, Start_002, TestSize.Level1) mic_->isTransReady_.store(true); EXPECT_EQ(DH_SUCCESS, mic_->Start()); + mic_->isOpened_.store(true); EXPECT_TRUE(mic_->IsOpened()); } diff --git a/services/audiomanager/test/unittest/sourcemanager/src/daudio_source_mgr_test.cpp b/services/audiomanager/test/unittest/sourcemanager/src/daudio_source_mgr_test.cpp index ad4854eecfd30a4defad7f5000c7d6c9fe5bd9fd..c6bd0e3570d5287b1ce70f05966f038945429752 100644 --- a/services/audiomanager/test/unittest/sourcemanager/src/daudio_source_mgr_test.cpp +++ b/services/audiomanager/test/unittest/sourcemanager/src/daudio_source_mgr_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2024 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 @@ -30,9 +30,9 @@ void DAudioSourceMgrTest::TearDownTestCase(void) {} void DAudioSourceMgrTest::SetUp(void) { - dAudioIpcCallback_ = new DAudioIpcCallback(); + dAudioIpcCallback_ = sptr(new DAudioIpcCallback()); remoteObject_ = dAudioIpcCallback_; - ipcCallbackProxy_ = (new DAudioIpcCallbackProxy(remoteObject_)); + ipcCallbackProxy_ = sptr(new DAudioIpcCallbackProxy(remoteObject_)); auto runner = AppExecFwk::EventRunner::Create(true); if (runner == nullptr) { return; diff --git a/services/common/audiodata/include/audio_data.h b/services/common/audiodata/include/audio_data.h index 4fb2c66e06a17c069cd2d5d78d640cdcdd64df39..333616075261dd2c879d621ace0f0da564a5bd6c 100644 --- a/services/common/audiodata/include/audio_data.h +++ b/services/common/audiodata/include/audio_data.h @@ -40,6 +40,7 @@ public: bool FindString(const string &name, string &value); private: + const uint32_t CAPACITY_MAX_SIZE = 2 * 4096; size_t capacity_ = 0; size_t rangeOffset_ = 0; size_t rangeLength_ = 0; diff --git a/services/common/audiodata/src/audio_data.cpp b/services/common/audiodata/src/audio_data.cpp index ad3031e42efd4eccc77bed6cb9194a278f68970f..8f5b2a1ab668243030d84e783e763154b95f122b 100644 --- a/services/common/audiodata/src/audio_data.cpp +++ b/services/common/audiodata/src/audio_data.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2024 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 @@ -20,7 +20,7 @@ namespace OHOS { namespace DistributedHardware { AudioData::AudioData(const size_t capacity) { - if (capacity != 0) { + if (capacity != 0 && capacity < CAPACITY_MAX_SIZE) { data_ = new (std::nothrow) uint8_t[capacity] {0}; if (data_ != nullptr) { capacity_ = capacity; diff --git a/services/test_example/distributedaudiotest.cpp b/services/test_example/distributedaudiotest.cpp index 39ec02c47192e1570bc691ebb68055a572f555e0..fb3c1d0efd4c0edff216b234b071c01d46038095 100644 --- a/services/test_example/distributedaudiotest.cpp +++ b/services/test_example/distributedaudiotest.cpp @@ -287,7 +287,7 @@ static void OpenSpk(const std::string &devId) return; } - g_callbackStub = new AudioParamCallbackImpl(); + g_callbackStub = OHOS::sptr(new AudioParamCallbackImpl()); if (g_adapter == nullptr) { return; }