From c1917ee55b1e34b46188bb9b23072598e4f23997 Mon Sep 17 00:00:00 2001 From: xuxiaoqing Date: Thu, 27 Apr 2023 02:29:29 +0000 Subject: [PATCH] fix: support downward compatibility of proxy in inheritance scenarios Signed-off-by: xuxiaoqing --- adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp | 34 +++++++++-- .../common/hdf_remote_adapter_test.cpp | 59 ++++++++++++++++++- framework/tools/hdi-gen/parser/parser.h | 2 +- 3 files changed, 89 insertions(+), 6 deletions(-) diff --git a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp index 130619cbf..46868ec40 100644 --- a/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp +++ b/adapter/uhdf2/ipc/src/hdf_remote_adapter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2023 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 @@ -15,8 +15,10 @@ #include #include +#include #include #include +#include #include "hdf_dump.h" #include "hdf_log.h" @@ -348,6 +350,29 @@ bool HdfRemoteAdapterWriteInterfaceToken(struct HdfRemoteService *service, struc return parcel->WriteInterfaceToken(holder->descriptor_); } +static bool CheckInterfaceTokenIngoreVersion(const std::string &client, const std::string &stub) +{ + std::vector clientVec; + OHOS::SplitStr(client, ".", clientVec); + std::vector stubVec; + OHOS::SplitStr(stub, ".", stubVec); + if (clientVec.size() != stubVec.size()) { + HDF_LOGE("%{public}s: client desc and stub desc have different size", __func__); + return false; + } + std::regex rVer("[V|v][0-9]+_[0-9]+"); + for (size_t i = 0; i < stubVec.size(); i++) { + if (std::regex_match(stubVec[i], rVer)) { + continue; + } + if (clientVec[i] != stubVec[i]) { + HDF_LOGE("%{public}s: mismatch between client desc and stub desc", __func__); + return false; + } + } + return true; +} + bool HdfRemoteAdapterCheckInterfaceToken(struct HdfRemoteService *service, struct HdfSBuf *data) { if (service == nullptr || data == nullptr) { @@ -367,11 +392,12 @@ bool HdfRemoteAdapterCheckInterfaceToken(struct HdfRemoteService *service, struc HDF_LOGE("failed to check interface, empty token"); return false; } - if (holder->descriptor_ != desc) { - HDF_LOGE("calling unknown interface: %{public}s", OHOS::Str16ToStr8(desc).c_str()); + std::string client = OHOS::Str16ToStr8(desc); + std::string stub = OHOS::Str16ToStr8(holder->descriptor_); + if (!CheckInterfaceTokenIngoreVersion(client, stub)) { + HDF_LOGE("calling unknown interface: %{public}s", client.c_str()); return false; } - return true; } diff --git a/framework/core/manager/test/unittest/common/hdf_remote_adapter_test.cpp b/framework/core/manager/test/unittest/common/hdf_remote_adapter_test.cpp index 1d28d05f5..1521456b3 100644 --- a/framework/core/manager/test/unittest/common/hdf_remote_adapter_test.cpp +++ b/framework/core/manager/test/unittest/common/hdf_remote_adapter_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 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 @@ -105,4 +105,61 @@ HWTEST_F(HdfRemoteAdapterTest, HdfRemoteAdapterTest004, TestSize.Level1) ret = HdfRemoteGetCallingUid(); ASSERT_TRUE(ret >= 0); } + +/* + * Test method CheckInterfaceTokenIngoreVersion, which can ignore version when checking interface description + */ +HWTEST_F(HdfRemoteAdapterTest, HdfRemoteAdapterTest005, TestSize.Level1) +{ + struct HdfRemoteService *service = HdfRemoteAdapterObtain(); + ASSERT_NE(service, nullptr); + bool status = HdfRemoteServiceSetInterfaceDesc(service, "ohos.hdi.foo.v1_1.ifoo"); + ASSERT_TRUE(status); + HdfSBuf *sBuf = HdfSbufTypedObtain(SBUF_IPC); + ASSERT_NE(sBuf, nullptr); + OHOS::MessageParcel *parcel = nullptr; + int ret = SbufToParcel(sBuf, &parcel); + ASSERT_EQ(ret, HDF_SUCCESS); + status = parcel->WriteInterfaceToken(u"ohos.hdi.foo.v1_0.ifoo"); + ASSERT_TRUE(status); + status = HdfRemoteServiceCheckInterfaceToken(service, sBuf); + ASSERT_TRUE(status); + HdfRemoteServiceRecycle(service); +} + +HWTEST_F(HdfRemoteAdapterTest, HdfRemoteAdapterTest006, TestSize.Level1) +{ + struct HdfRemoteService *service = HdfRemoteAdapterObtain(); + ASSERT_NE(service, nullptr); + int status = HdfRemoteServiceSetInterfaceDesc(service, "ohos.hdi.foo.v1_1.ifoo"); + ASSERT_TRUE(status); + HdfSBuf *sBuf = HdfSbufTypedObtain(SBUF_IPC); + ASSERT_NE(sBuf, nullptr); + OHOS::MessageParcel *parcel = nullptr; + int ret = SbufToParcel(sBuf, &parcel); + ASSERT_EQ(ret, HDF_SUCCESS); + status = parcel->WriteInterfaceToken(u"ohos.hdi.foo.v1_0"); + ASSERT_TRUE(status); + status = HdfRemoteServiceCheckInterfaceToken(service, sBuf); + ASSERT_FALSE(status); + HdfRemoteServiceRecycle(service); +} + +HWTEST_F(HdfRemoteAdapterTest, HdfRemoteAdapterTest007, TestSize.Level1) +{ + struct HdfRemoteService *service = HdfRemoteAdapterObtain(); + ASSERT_NE(service, nullptr); + int status = HdfRemoteServiceSetInterfaceDesc(service, "ohos.hdi.foo.v1_1.ifoo"); + ASSERT_TRUE(status); + HdfSBuf *sBuf = HdfSbufTypedObtain(SBUF_IPC); + ASSERT_NE(sBuf, nullptr); + OHOS::MessageParcel *parcel = nullptr; + int ret = SbufToParcel(sBuf, &parcel); + ASSERT_EQ(ret, HDF_SUCCESS); + status = parcel->WriteInterfaceToken(u"ohos.hdi.foo.v1_0.ifoo_"); + ASSERT_TRUE(status); + status = HdfRemoteServiceCheckInterfaceToken(service, sBuf); + ASSERT_FALSE(status); + HdfRemoteServiceRecycle(service); +} } // namespace OHOS diff --git a/framework/tools/hdi-gen/parser/parser.h b/framework/tools/hdi-gen/parser/parser.h index 0e006389a..3f63c41b8 100644 --- a/framework/tools/hdi-gen/parser/parser.h +++ b/framework/tools/hdi-gen/parser/parser.h @@ -30,7 +30,7 @@ using AttrSet = std::set; struct AstCompare { bool operator()(const AutoPtr &lhs, const AutoPtr &rhs) const { - return lhs->GetMinorVer() > rhs->GetMinorVer(); + return lhs->GetMinorVer() < rhs->GetMinorVer(); } }; using AstMergeMap = std::map, AstCompare>>; -- Gitee