From d49aa5f3f4539ba2bb74f124cb643f3a8d337818 Mon Sep 17 00:00:00 2001 From: pwx1285814 Date: Sat, 16 Nov 2024 11:58:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dfuzz=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: pwx1285814 --- .../2.0/include/screenregionmgr.h | 3 ++- .../2.0/src/screenregionmgr.cpp | 21 +++++++++++-------- .../dscreenmgr/2.0/include/dscreen_manager.h | 1 + .../dscreenmgr/2.0/src/dscreen_manager.cpp | 21 +++++++++++-------- .../dscreensourceservice_fuzzer.cpp | 2 ++ .../encoder/include/idscreen_dbg_itf.h | 4 ++++ .../encoder/src/image_source_encoder.cpp | 10 ++++++++- 7 files changed, 42 insertions(+), 20 deletions(-) diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregionmgr.h b/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregionmgr.h index 853f8fcd..01e3aaf4 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregionmgr.h +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregionmgr.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 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 @@ -57,6 +57,7 @@ private: std::string localDevId_; IAVEngineProvider *providerPtr_ = nullptr; + void* pHandler_ = nullptr; }; } // namespace V2_0 } // namespace DistributedHardware diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp index b81e5646..3902d1b8 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp @@ -156,16 +156,16 @@ void ScreenRegionManager::GetScreenDumpInfo(std::string &result) int32_t ScreenRegionManager::LoadAVReceiverEngineProvider() { DHLOGI("LoadAVReceiverEngineProvider enter"); - void *pHandler = dlopen(RECEIVER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE); - if (pHandler == nullptr) { + pHandler_ = dlopen(RECEIVER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE); + if (pHandler_ == nullptr) { DHLOGE("so: %{public}s load failed, failed reason : %{public}s", RECEIVER_SO_NAME.c_str(), dlerror()); return ERR_DH_AV_TRANS_NULL_VALUE; } - AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pHandler, GET_PROVIDER_FUNC.c_str()); + AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pHandler_, GET_PROVIDER_FUNC.c_str()); if (getEngineFactoryFunc == nullptr) { DHLOGE("av transport engine factory function handler is null, failed reason : %{public}s", dlerror()); - dlclose(pHandler); - pHandler = nullptr; + dlclose(pHandler_); + pHandler_ = nullptr; return ERR_DH_AV_TRANS_NULL_VALUE; } providerPtr_ = getEngineFactoryFunc(OWNER_NAME_D_SCREEN); @@ -175,10 +175,13 @@ int32_t ScreenRegionManager::LoadAVReceiverEngineProvider() int32_t ScreenRegionManager::UnloadAVReceiverEngineProvider() { DHLOGI("UnloadAVReceiverEngineProvider enter"); - void *pHandler = dlopen(RECEIVER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE); - if (pHandler != nullptr) { - dlclose(pHandler); - pHandler = nullptr; + if (providerPtr_ != nullptr) { + delete providerPtr_; + providerPtr_ = nullptr; + } + if (pHandler_ != nullptr) { + dlclose(pHandler_); + pHandler_ = nullptr; } return DH_SUCCESS; } diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h index ff5ea254..eab5b6cc 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h @@ -81,6 +81,7 @@ private: std::map> dScreens_; IAVEngineProvider *providerPtr_ = nullptr; + void* pHandler_ = nullptr; sptr dScreenGroupListener_ = nullptr; std::shared_ptr dScreenCallback_ = nullptr; sptr dScreenSourceCallbackProxy_ = nullptr; diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp index 91bd7ee2..642dda1d 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp @@ -397,16 +397,16 @@ void DScreenManager::PublishMessage(const DHTopic topic, const std::shared_ptrInitSource(params, callback); sourceServicePtr->RegisterDistributedHardware(devId, dhId, param, reqId); sourceServicePtr->DScreenNotify(devId, eventCode, eventContent); + sourceServicePtr->UnregisterDistributedHardware(devId, dhId, reqId); + sourceServicePtr->ReleaseSource(); } } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h b/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h index 6583fe00..a76d96a6 100644 --- a/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h +++ b/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h @@ -24,11 +24,15 @@ const std::string GET_DBG_ITF_FUNC = "GetDBGItf"; const std::string GET_IMAGE_DIRTY_FUNC = "GetImageSetDirty"; class IDScreenDBGItf { public: + virtual ~IDScreenDBGItf() = default; + virtual int32_t Init() = 0; virtual int32_t Release() = 0; }; class IImageSetDirty { public: + virtual ~IImageSetDirty() = default; + virtual void SetDamage(std::vector> dirtyVecs) = 0; virtual std::vector> GetDamage() = 0; }; diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 9e697a3c..a2d74ab6 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -249,8 +249,16 @@ int32_t ImageSourceEncoder::ReleaseEncoder() DHLOGE("%{public}s: Release encoder failed.", DSCREEN_LOG_TAG); return ERR_DH_SCREEN_CODEC_RELEASE_FAILED; } - if (pHandler_ != nullptr) { + if (dscreenDbgItfPtr_ != nullptr) { dscreenDbgItfPtr_->Release(); + delete dscreenDbgItfPtr_; + dscreenDbgItfPtr_ = nullptr; + } + if (imageSetDirtyPtr_ != nullptr) { + delete imageSetDirtyPtr_; + imageSetDirtyPtr_ = nullptr; + } + if (pHandler_ != nullptr) { dlclose(pHandler_); } encodeVideoCallback_ = nullptr; -- Gitee