修改fuzz测试发现问题:sa进程动态拉起和退出,并发场景下crash问题

Signed-off-by: wangchaole <wangchaole1@huawei.com>
This commit is contained in:
wangchaole
2022-04-28 15:08:14 +08:00
parent 4b86465498
commit 92fc0ad05d
10 changed files with 27 additions and 89 deletions
@@ -49,7 +49,6 @@ ohos_shared_library("distributed_camera_sink_sdk") {
]
external_deps = [
"eventhandler:libeventhandler",
"hiviewdfx_hilog_native:libhilog",
"ipc:ipc_core",
"samgr_standard:samgr_proxy",
@@ -16,7 +16,6 @@
#ifndef OHOS_DCAMERA_SINK_HANDLER_IPC_H
#define OHOS_DCAMERA_SINK_HANDLER_IPC_H
#include "event_handler.h"
#include "idistributed_camera_sink.h"
#include "single_instance.h"
@@ -46,7 +45,6 @@ private:
std::mutex sinkLocalDmsLock_;
bool isInit_;
std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
std::mutex initDmsLock_;
};
} // namespace DistributedHardware
@@ -46,8 +46,6 @@ void DCameraSinkHandlerIpc::Init()
DHLOGI("DCameraSinkHandlerIpc has already init");
return;
}
auto runner = AppExecFwk::EventRunner::Create("DCameraSinkHandlerIpcHandler");
serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
sinkLocalRecipient_ = new SinkLocalRecipient();
isInit_ = true;
DHLOGI("DCameraSinkHandlerIpc Init End");
@@ -62,8 +60,6 @@ void DCameraSinkHandlerIpc::UnInit()
return;
}
DeleteSinkLocalDhms();
DHLOGI("DCameraSinkHandlerIpc Start free serviceHandler");
serviceHandler_ = nullptr;
DHLOGI("DCameraSinkHandlerIpc Start free recipient");
sinkLocalRecipient_ = nullptr;
isInit_ = false;
@@ -127,28 +123,18 @@ void DCameraSinkHandlerIpc::SinkLocalRecipient::OnRemoteDied(const wptr<IRemoteO
void DCameraSinkHandlerIpc::OnSinkLocalDmsDied(const wptr<IRemoteObject>& remote)
{
sptr<IRemoteObject> diedRemoted = remote.promote();
if (diedRemoted == nullptr) {
DHLOGE("OnSinkLocalDmsDied promote failed!");
return;
}
DHLOGI("OnSinkLocalDmsDied delete diedRemoted");
auto remoteDmsDiedFunc = [this, diedRemoted]() {
OnSinkLocalDmsDied(diedRemoted);
};
if (serviceHandler_ != nullptr) {
serviceHandler_->PostTask(remoteDmsDiedFunc);
}
}
void DCameraSinkHandlerIpc::OnSinkLocalDmsDied(const sptr<IRemoteObject>& remote)
{
std::lock_guard<std::mutex> autoLock(sinkLocalDmsLock_);
if (localSink_ == nullptr) {
DHLOGE("DCameraSinkHandlerIpc::OnSinkLocalDmsDied, localSink is null.");
return;
}
if (localSink_->AsObject() != remote) {
sptr<IRemoteObject> diedRemoted = remote.promote();
if (diedRemoted == nullptr) {
DHLOGE("OnSinkLocalDmsDied promote failed!");
return;
}
if (localSink_->AsObject() != diedRemoted) {
DHLOGI("OnSinkLocalDmsDied not found remote object.");
return;
}
@@ -52,7 +52,6 @@ ohos_shared_library("distributed_camera_source_sdk") {
]
external_deps = [
"eventhandler:libeventhandler",
"hiviewdfx_hilog_native:libhilog",
"ipc:ipc_core",
"samgr_standard:samgr_proxy",
@@ -16,7 +16,6 @@
#ifndef OHOS_DCAMERA_SOURCE_HANDLER_IPC_H
#define OHOS_DCAMERA_SOURCE_HANDLER_IPC_H
#include "event_handler.h"
#include "idistributed_camera_source.h"
#include "single_instance.h"
@@ -34,7 +33,6 @@ public:
private:
DCameraSourceHandlerIpc();
~DCameraSourceHandlerIpc();
void OnSourceLocalDmsDied(const sptr<IRemoteObject>& remote);
void DeleteSourceLocalDhms();
class SourceLocalRecipient : public IRemoteObject::DeathRecipient {
@@ -46,7 +44,6 @@ private:
std::mutex sourceLocalDmsLock_;
bool isInit_;
std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
std::mutex initDmsLock_;
};
} // namespace DistributedHardware
@@ -46,8 +46,6 @@ void DCameraSourceHandlerIpc::Init()
DHLOGI("DCameraSourceHandlerIpc has already init");
return;
}
auto runner = AppExecFwk::EventRunner::Create("DCameraSourceHandlerIpcHandler");
serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
sourceLocalRecipient_ = new SourceLocalRecipient();
isInit_ = true;
DHLOGI("DCameraSourceHandlerIpc Init End");
@@ -62,8 +60,6 @@ void DCameraSourceHandlerIpc::UnInit()
return;
}
DeleteSourceLocalDhms();
DHLOGI("DCameraSourceHandlerIpc Start free serviceHandler");
serviceHandler_ = nullptr;
DHLOGI("DCameraSourceHandlerIpc Start free recipient");
sourceLocalRecipient_ = nullptr;
isInit_ = false;
@@ -127,35 +123,25 @@ void DCameraSourceHandlerIpc::SourceLocalRecipient::OnRemoteDied(const wptr<IRem
void DCameraSourceHandlerIpc::OnSourceLocalDmsDied(const wptr<IRemoteObject>& remote)
{
sptr<IRemoteObject> diedRemoted = remote.promote();
if (diedRemoted == nullptr) {
DHLOGE("OnSourceLocalDmsDied promote failed!");
return;
}
DHLOGI("OnSourceLocalDmsDied delete diedRemoted");
auto remoteDmsDiedFunc = [this, diedRemoted]() {
OnSourceLocalDmsDied(diedRemoted);
};
if (serviceHandler_ != nullptr) {
serviceHandler_->PostTask(remoteDmsDiedFunc);
}
}
void DCameraSourceHandlerIpc::OnSourceLocalDmsDied(const sptr<IRemoteObject>& remote)
{
std::lock_guard<std::mutex> autoLock(sourceLocalDmsLock_);
if (localSource_ == nullptr) {
DHLOGE("DCameraSourceHandlerIpc::OnSourceLocalDmsDied, localSource is null.");
return;
}
if (localSource_->AsObject() != remote) {
sptr<IRemoteObject> diedRemoted = remote.promote();
if (diedRemoted == nullptr) {
DHLOGE("OnSourceLocalDmsDied promote failed!");
return;
}
if (localSource_->AsObject() != diedRemoted) {
DHLOGI("OnSourceLocalDmsDied not found remote object.");
return;
}
DHLOGI("OnSourceLocalDmsDied Clear");
localSource_->AsObject()->RemoveDeathRecipient(sourceLocalRecipient_);
localSource_ = nullptr;
}
} // namespace DistributedHardware
} // namespace OHOS
@@ -16,8 +16,10 @@
#ifndef OHOS_DCAMERA_SINK_SERVICE_IPC_H
#define OHOS_DCAMERA_SINK_SERVICE_IPC_H
#include "event_handler.h"
#include "idistributed_camera_source.h"
#include <map>
#include "single_instance.h"
namespace OHOS {
@@ -35,7 +37,6 @@ public:
private:
DCameraSinkServiceIpc();
~DCameraSinkServiceIpc();
void OnSourceRemoteDmsDied(const sptr<IRemoteObject>& remote);
void ClearSourceRemoteDhms();
class SourceRemoteRecipient : public IRemoteObject::DeathRecipient {
@@ -47,7 +48,6 @@ private:
std::mutex sourceRemoteDmsLock_;
bool isInit_;
std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
std::mutex initDmsLock_;
};
} // namespace DistributedHardware
@@ -46,8 +46,6 @@ void DCameraSinkServiceIpc::Init()
DHLOGI("DCameraSinkServiceIpc has already init");
return;
}
auto runner = AppExecFwk::EventRunner::Create("DCameraSinkServiceIpcHandler");
serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
sourceRemoteRecipient_ = new SourceRemoteRecipient();
isInit_ = true;
DHLOGI("DCameraSinkServiceIpc Init End");
@@ -62,8 +60,6 @@ void DCameraSinkServiceIpc::UnInit()
return;
}
ClearSourceRemoteDhms();
DHLOGI("DCameraSinkServiceIpc Start free serviceHandler");
serviceHandler_ = nullptr;
DHLOGI("DCameraSinkServiceIpc Start free recipient");
sourceRemoteRecipient_ = nullptr;
isInit_ = false;
@@ -155,37 +151,28 @@ void DCameraSinkServiceIpc::SourceRemoteRecipient::OnRemoteDied(const wptr<IRemo
void DCameraSinkServiceIpc::OnSourceRemoteDmsDied(const wptr<IRemoteObject>& remote)
{
DHLOGI("OnSourceRemoteDmsDied delete diedRemoted");
std::lock_guard<std::mutex> autoLock(sourceRemoteDmsLock_);
sptr<IRemoteObject> diedRemoted = remote.promote();
if (diedRemoted == nullptr) {
DHLOGE("OnSourceRemoteDmsDied promote failed!");
return;
}
DHLOGI("OnSourceRemoteDmsDied delete diedRemoted");
auto remoteDmsDiedFunc = [this, diedRemoted]() {
OnSourceRemoteDmsDied(diedRemoted);
};
if (serviceHandler_ != nullptr) {
serviceHandler_->PostTask(remoteDmsDiedFunc);
}
}
void DCameraSinkServiceIpc::OnSourceRemoteDmsDied(const sptr<IRemoteObject>& remote)
{
std::lock_guard<std::mutex> autoLock(sourceRemoteDmsLock_);
auto iter = std::find_if(remoteSources_.begin(), remoteSources_.end(), [&](
const std::pair<std::string, sptr<IDistributedCameraSource>> &item)->bool {
return item.second->AsObject() == remote;
return item.second->AsObject() == diedRemoted;
});
if (iter == remoteSources_.end()) {
DHLOGI("OnSourceRemoteDmsDied not found remote object");
return;
}
DHLOGI("OnSourceRemoteDmsDied remote.devId: %s", GetAnonyString(iter->first).c_str());
if (iter->second != nullptr) {
iter->second->AsObject()->RemoveDeathRecipient(sourceRemoteRecipient_);
}
remoteSources_.erase(iter);
}
} // namespace DistributedHardware
} // namespace OHOS
@@ -16,8 +16,10 @@
#ifndef OHOS_DCAMERA_SOURCE_SERVICE_IPC_H
#define OHOS_DCAMERA_SOURCE_SERVICE_IPC_H
#include "event_handler.h"
#include "idistributed_camera_sink.h"
#include <map>
#include "single_instance.h"
namespace OHOS {
@@ -35,7 +37,6 @@ public:
private:
DCameraSourceServiceIpc();
~DCameraSourceServiceIpc();
void OnSinkRemoteDmsDied(const sptr<IRemoteObject>& remote);
void ClearSinkRemoteDhms();
class SinkRemoteRecipient : public IRemoteObject::DeathRecipient {
@@ -47,7 +48,6 @@ private:
std::mutex sinkRemoteDmsLock_;
bool isInit_;
std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
std::mutex initDmsLock_;
};
} // namespace DistributedHardware
@@ -46,8 +46,6 @@ void DCameraSourceServiceIpc::Init()
DHLOGI("DCameraSourceServiceIpc has already init");
return;
}
auto runner = AppExecFwk::EventRunner::Create("DCameraSourceServiceIpcHandler");
serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
sinkRemoteRecipient_ = new SinkRemoteRecipient();
isInit_ = true;
DHLOGI("DCameraSourceServiceIpc Init End");
@@ -62,8 +60,6 @@ void DCameraSourceServiceIpc::UnInit()
return;
}
ClearSinkRemoteDhms();
DHLOGI("DCameraSourceServiceIpc UnInit Start free servicehandle");
serviceHandler_ = nullptr;
DHLOGI("DCameraSourceServiceIpc UnInit Start free recipient");
sinkRemoteRecipient_ = nullptr;
isInit_ = false;
@@ -155,26 +151,16 @@ void DCameraSourceServiceIpc::SinkRemoteRecipient::OnRemoteDied(const wptr<IRemo
void DCameraSourceServiceIpc::OnSinkRemoteDmsDied(const wptr<IRemoteObject>& remote)
{
DHLOGI("OnSinkRemoteDmsDied delete diedRemoted");
std::lock_guard<std::mutex> autoLock(sinkRemoteDmsLock_);
sptr<IRemoteObject> diedRemoted = remote.promote();
if (diedRemoted == nullptr) {
DHLOGE("OnSinkRemoteDmsDied promote failed!");
return;
}
DHLOGI("OnSinkRemoteDmsDied delete diedRemoted");
auto remoteDmsDiedFunc = [this, diedRemoted]() {
OnSinkRemoteDmsDied(diedRemoted);
};
if (serviceHandler_ != nullptr) {
serviceHandler_->PostTask(remoteDmsDiedFunc);
}
}
void DCameraSourceServiceIpc::OnSinkRemoteDmsDied(const sptr<IRemoteObject>& remote)
{
std::lock_guard<std::mutex> autoLock(sinkRemoteDmsLock_);
auto iter = std::find_if(remoteSinks_.begin(), remoteSinks_.end(), [&](
const std::pair<std::string, sptr<IDistributedCameraSink>> &item)->bool {
return item.second->AsObject() == remote;
return item.second->AsObject() == diedRemoted;
});
if (iter == remoteSinks_.end()) {
DHLOGI("OnSinkRemoteDmsDied not found remote object");