【任务描述】
int DevSvcManagerStubDispatch(
struct HdfRemoteService* service, int code, struct HdfSBuf *data, struct HdfSBuf *reply)
{
这里的 struct HdfRemoteService* service , 应该定义成struct HdfObject* service 比较合适
其他类似,因 struct DevSvcManagerStub *stub = (struct DevSvcManagerStub *)service 中 HdfRemoteService 和 DevSvcManagerStub 没有直接关系, 容易内参泄露
【解决方案】
【任务来源】
DevSvcManagerStubDispatch(struct HdfRemoteService* service, ......)
{
struct DevSvcManagerStub *stub = (struct DevSvcManagerStub )service;
}
这里的 service,实际上是 HdfRemoteService->target,就是一个 HdfObject;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
static HdfRemoteDispatcher
的Dispatch
方法存在两种使用情况:
HdfRemoteDispatcher
由服务实现者定义并实例化,Dispatch
回调方法为service的target对象,也就是HdfRemoteServiceObtain
接口的第一个参数,在回调时确实存在参数实际类型不匹配的情况,但是,也是为例和下面的情况2做兼容产生的妥协。HdfRemoteDispatcher
由框架实现(参考下面实现),其HdfRemoteDispatcher
也由框架定义和实例化,功能是通过IPC发送消息,Dispatch
回调方法参数是完全匹配的,接受一个struct HdfRemoteService*
对象。struct HdfRemoteService *HdfRemoteAdapterBind(OHOS::sptr<OHOS::IRemoteObject> binder)
{
struct HdfRemoteService *remoteService = nullptr;
static HdfRemoteDispatcher dispatcher = {
.Dispatch = HdfRemoteAdapterDispatch,
.DispatchAsync = HdfRemoteAdapterDispatchAsync,
};
struct HdfRemoteServiceHolder *holder = new HdfRemoteServiceHolder();
if (holder != nullptr) {
holder->remote_ = binder;
remoteService = &holder->service_;
remoteService->dispatcher = &dispatcher;
remoteService->index = (uint64_t)binder.GetRefPtr();
return remoteService;
}
return nullptr;
}
所以,在服务端的'DevSvcManagerStubDispatch'参数类型不严格匹配,是出于统一客户端、服务端对象的设计妥协,无法直接修改为struct HdfObject*
。
HdfObject *
表示过于宽泛,为让HdfRemoteService
和HdfRemoteDispatcher
的联系更清晰,所以还是建议不修改。谢谢你的issue。
登录 后才可以发表评论