From 88aaa8749ae7cbc65abe81c1ccc64716cfdaae0f Mon Sep 17 00:00:00 2001 From: huyx Date: Thu, 27 Jun 2024 19:16:35 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3host=20crash=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyx --- adapter/uhdf2/ipc/include/hdf_remote_adapter.h | 1 + adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/adapter/uhdf2/ipc/include/hdf_remote_adapter.h b/adapter/uhdf2/ipc/include/hdf_remote_adapter.h index 9dbc817fd..65e33deea 100644 --- a/adapter/uhdf2/ipc/include/hdf_remote_adapter.h +++ b/adapter/uhdf2/ipc/include/hdf_remote_adapter.h @@ -34,6 +34,7 @@ public: OHOS::MessageParcel &data, OHOS::MessageParcel &reply, OHOS::MessageOption &option) override; ~HdfRemoteServiceStub(); int32_t Dump(int32_t fd, const std::vector &args) override; + void HdfRemoteStubClearHolder(); private: struct HdfRemoteService *service_; }; diff --git a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp index 5b47f5303..12fb4ace1 100644 --- a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp +++ b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp @@ -63,6 +63,11 @@ int HdfRemoteServiceStub::OnRemoteRequest(uint32_t code, return ret; } +void HdfRemoteServiceStub::HdfRemoteStubClearHolder() +{ + service_ = nullptr; +} + HdfRemoteServiceStub::~HdfRemoteServiceStub() { HDF_LOGD("~HdfRemoteServiceStub"); @@ -230,6 +235,15 @@ void HdfRemoteAdapterRecycle(struct HdfRemoteService *object) { struct HdfRemoteServiceHolder *holder = reinterpret_cast(object); if (holder != nullptr) { + auto remote = holder->remote_; + if (remote != nullptr) { + if (!remote->IsProxyObject()) { + HdfRemoteServiceStub *stub = dynamic_cast(remote.GetRefPtr()); + if (stub != nullptr) { + stub->HdfRemoteStubClearHolder(); + } + } + } holder->service_.target = nullptr; holder->service_.dispatcher = nullptr; holder->descriptor_.clear(); -- Gitee From 0428db3c85525de2b4045b3a1d36627f105d1b76 Mon Sep 17 00:00:00 2001 From: huyx Date: Thu, 27 Jun 2024 20:41:47 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyx --- adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp index 12fb4ace1..63de8cde0 100644 --- a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp +++ b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp @@ -236,12 +236,10 @@ void HdfRemoteAdapterRecycle(struct HdfRemoteService *object) struct HdfRemoteServiceHolder *holder = reinterpret_cast(object); if (holder != nullptr) { auto remote = holder->remote_; - if (remote != nullptr) { - if (!remote->IsProxyObject()) { - HdfRemoteServiceStub *stub = dynamic_cast(remote.GetRefPtr()); - if (stub != nullptr) { - stub->HdfRemoteStubClearHolder(); - } + if (remote != nullptr && !remote->IsProxyObject()) { + HdfRemoteServiceStub *stub = reinterpret_cast(remote.GetRefPtr()); + if (stub != nullptr) { + stub->HdfRemoteStubClearHolder(); } } holder->service_.target = nullptr; -- Gitee From 5d908503dc3477070d2066cb3f9238b09d3e0b2b Mon Sep 17 00:00:00 2001 From: huyx Date: Fri, 28 Jun 2024 11:06:55 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyx --- adapter/uhdf2/ipc/include/hdf_remote_adapter.h | 2 ++ adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/adapter/uhdf2/ipc/include/hdf_remote_adapter.h b/adapter/uhdf2/ipc/include/hdf_remote_adapter.h index 65e33deea..ad8ffa7ad 100644 --- a/adapter/uhdf2/ipc/include/hdf_remote_adapter.h +++ b/adapter/uhdf2/ipc/include/hdf_remote_adapter.h @@ -22,6 +22,7 @@ #include "hdf_remote_adapter_if.h" #include "hdf_remote_service.h" +#include #ifdef __cplusplus extern "C" { @@ -37,6 +38,7 @@ public: void HdfRemoteStubClearHolder(); private: struct HdfRemoteService *service_; + std::shared_mutex mutex_; }; class HdfDeathNotifier : public OHOS::IRemoteObject::DeathRecipient { diff --git a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp index 63de8cde0..ba3cf8920 100644 --- a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp +++ b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp @@ -47,6 +47,7 @@ int HdfRemoteServiceStub::OnRemoteRequest(uint32_t code, return HDF_ERR_INVALID_OBJECT; } + std::shared_lock lock(mutex_); int ret = HDF_FAILURE; struct HdfSBuf *dataSbuf = ParcelToSbuf(&data); struct HdfSBuf *replySbuf = ParcelToSbuf(&reply); @@ -65,6 +66,7 @@ int HdfRemoteServiceStub::OnRemoteRequest(uint32_t code, void HdfRemoteServiceStub::HdfRemoteStubClearHolder() { + std::unique_lock lock(mutex_); service_ = nullptr; } -- Gitee From 56e9262878084246d989c8df59d3b9998507da76 Mon Sep 17 00:00:00 2001 From: huyx Date: Fri, 28 Jun 2024 14:39:18 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyx --- adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp index ba3cf8920..984af37b2 100644 --- a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp +++ b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp @@ -42,16 +42,16 @@ int HdfRemoteServiceStub::OnRemoteRequest(uint32_t code, { HDF_LOGD("OnRemoteRequest enter"); (void)option; - if (service_ == nullptr) { - HDF_LOGE("service_ is nullptr"); - return HDF_ERR_INVALID_OBJECT; - } - std::shared_lock lock(mutex_); int ret = HDF_FAILURE; struct HdfSBuf *dataSbuf = ParcelToSbuf(&data); struct HdfSBuf *replySbuf = ParcelToSbuf(&reply); + std::shared_lock lock(mutex_); + if (service_ == nullptr) { + HDF_LOGE("service_ is nullptr"); + return HDF_ERR_INVALID_OBJECT; + } struct HdfRemoteDispatcher *dispatcher = service_->dispatcher; if (dispatcher != nullptr && dispatcher->Dispatch != nullptr) { ret = dispatcher->Dispatch(reinterpret_cast(service_->target), code, dataSbuf, replySbuf); -- Gitee