summaryrefslogtreecommitdiff
path: root/transport
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2020-08-27 10:17:40 -0700
committerXin Li <delphij@google.com>2020-08-27 10:17:40 -0700
commit372dcf5177c25424f86b882efadc69ba38b8f7de (patch)
tree8675d9e78dac8f538aa6958d38ec98b660aaa4d1 /transport
parent44f931b130c726cda5005e3679295f711b734c61 (diff)
parent219106c3719284c8621825a12add22c02e7cd2db (diff)
downloadlibhidl-372dcf5177c25424f86b882efadc69ba38b8f7de.tar.gz
Merge Android R (rvc-dev-plus-aosp-without-vendor@6692709)temp_sam_168057903
Bug: 166295507 Merged-In: I131d903c43aaaf1ba934933ac89aba5e09a34269 Change-Id: I6a8acb690e153838070951963797f69d92e58c1e
Diffstat (limited to 'transport')
-rw-r--r--transport/HidlBinderSupport.cpp29
-rw-r--r--transport/ServiceManagement.cpp9
-rw-r--r--transport/allocator/1.0/vts/functional/Android.bp1
-rw-r--r--transport/allocator/1.0/vts/functional/AndroidTest.xml32
-rw-r--r--transport/allocator/1.0/vts/functional/VtsHidlAllocatorV1_0TargetTest.cpp37
-rw-r--r--transport/base/1.0/vts/functional/Android.bp1
-rw-r--r--transport/include/hidl/HidlBinderSupport.h10
-rw-r--r--transport/include/hidl/HidlLazyUtils.h2
8 files changed, 52 insertions, 69 deletions
diff --git a/transport/HidlBinderSupport.cpp b/transport/HidlBinderSupport.cpp
index 89b3a24..b48b460 100644
--- a/transport/HidlBinderSupport.cpp
+++ b/transport/HidlBinderSupport.cpp
@@ -19,6 +19,9 @@
#include <hidl/HidlBinderSupport.h>
#include <android/hidl/base/1.0/BpHwBase.h>
+#include <android/hidl/manager/1.0/BpHwServiceManager.h>
+#include <android/hidl/manager/1.1/BpHwServiceManager.h>
+#include <android/hidl/manager/1.2/BpHwServiceManager.h>
#include <hwbinder/IPCThreadState.h>
#include "InternalStatic.h" // TODO(b/69122224): remove this include, for getOrCreateCachedBinder
@@ -206,16 +209,34 @@ status_t writeToParcel(const Status &s, Parcel* parcel) {
return status;
}
+// assume: iface != nullptr, iface isRemote
+// This function is to sandbox a cast through a BpHw* class into a function, so
+// that we can remove cfi sanitization from it. Do not add additional
+// functionality here.
+__attribute__((no_sanitize("cfi"))) static inline BpHwRefBase* forceGetRefBase(
+ ::android::hidl::base::V1_0::IBase* ifacePtr) {
+ using ::android::hidl::base::V1_0::BpHwBase;
+
+ // canary only
+ static_assert(sizeof(BpHwBase) == sizeof(hidl::manager::V1_0::BpHwServiceManager));
+ static_assert(sizeof(BpHwBase) == sizeof(hidl::manager::V1_1::BpHwServiceManager));
+ static_assert(sizeof(BpHwBase) == sizeof(hidl::manager::V1_2::BpHwServiceManager));
+
+ // All BpHw* are generated the same. This may be BpHwServiceManager,
+ // BpHwFoo, or any other class. For ABI compatibility, we can't modify the
+ // class hierarchy of these, so we have no way to get BpHwRefBase from a
+ // remote ifacePtr.
+ BpHwBase* bpBase = static_cast<BpHwBase*>(ifacePtr);
+ return static_cast<BpHwRefBase*>(bpBase);
+}
+
sp<IBinder> getOrCreateCachedBinder(::android::hidl::base::V1_0::IBase* ifacePtr) {
if (ifacePtr == nullptr) {
return nullptr;
}
if (ifacePtr->isRemote()) {
- using ::android::hidl::base::V1_0::BpHwBase;
-
- BpHwBase* bpBase = static_cast<BpHwBase*>(ifacePtr);
- BpHwRefBase* bpRefBase = static_cast<BpHwRefBase*>(bpBase);
+ BpHwRefBase* bpRefBase = forceGetRefBase(ifacePtr);
return sp<IBinder>(bpRefBase->remote());
}
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index 2f69351..cbe7ac6 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -394,8 +394,7 @@ struct PassthroughServiceManager : IServiceManager1_1 {
dlerror(); // clear
- static std::string halLibPathVndkSp = android::base::StringPrintf(
- HAL_LIBRARY_PATH_VNDK_SP_FOR_VERSION, details::getVndkVersionStr().c_str());
+ static std::string halLibPathVndkSp = details::getVndkSpHwPath();
std::vector<std::string> paths = {
HAL_LIBRARY_PATH_ODM, HAL_LIBRARY_PATH_VENDOR, halLibPathVndkSp,
#ifndef __ANDROID_VNDK__
@@ -512,10 +511,8 @@ struct PassthroughServiceManager : IServiceManager1_1 {
Return<void> debugDump(debugDump_cb _hidl_cb) override {
using Arch = ::android::hidl::base::V1_0::DebugInfo::Architecture;
using std::literals::string_literals::operator""s;
- static std::string halLibPathVndkSp64 = android::base::StringPrintf(
- HAL_LIBRARY_PATH_VNDK_SP_64BIT_FOR_VERSION, details::getVndkVersionStr().c_str());
- static std::string halLibPathVndkSp32 = android::base::StringPrintf(
- HAL_LIBRARY_PATH_VNDK_SP_32BIT_FOR_VERSION, details::getVndkVersionStr().c_str());
+ static std::string halLibPathVndkSp64 = details::getVndkSpHwPath("lib64");
+ static std::string halLibPathVndkSp32 = details::getVndkSpHwPath("lib");
static std::vector<std::pair<Arch, std::vector<const char*>>> sAllPaths{
{Arch::IS_64BIT,
{
diff --git a/transport/allocator/1.0/vts/functional/Android.bp b/transport/allocator/1.0/vts/functional/Android.bp
index f3cbed6..ba7aa70 100644
--- a/transport/allocator/1.0/vts/functional/Android.bp
+++ b/transport/allocator/1.0/vts/functional/Android.bp
@@ -24,6 +24,7 @@ cc_test {
static_libs: [
"android.hidl.allocator@1.0",
],
+ test_suites: ["general-tests", "vts"],
}
vts_config {
diff --git a/transport/allocator/1.0/vts/functional/AndroidTest.xml b/transport/allocator/1.0/vts/functional/AndroidTest.xml
deleted file mode 100644
index 6ac167f..0000000
--- a/transport/allocator/1.0/vts/functional/AndroidTest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
- 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
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<configuration description="Config for VTS VtsHidlAllocatorV1_0Target test cases">
- <option name="config-descriptor:metadata" key="plan" value="vts-treble" />
- <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
- <option name="abort-on-push-failure" value="false"/>
- <option name="push-group" value="HalHidlTargetTest.push"/>
- </target_preparer>
- <multi_target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer" />
- <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
- <option name="test-module-name" value="VtsHidlAllocatorV1_0Target"/>
- <option name="binary-test-working-directory" value="_32bit::/data/nativetest/" />
- <option name="binary-test-working-directory" value="_64bit::/data/nativetest64/" />
- <option name="binary-test-source" value="_32bit::DATA/nativetest/VtsHidlAllocatorV1_0TargetTest/VtsHidlAllocatorV1_0TargetTest" />
- <option name="binary-test-source" value="_64bit::DATA/nativetest64/VtsHidlAllocatorV1_0TargetTest/VtsHidlAllocatorV1_0TargetTest" />
- <option name="binary-test-type" value="hal_hidl_gtest"/>
- <option name="test-timeout" value="5m"/>
- </test>
-</configuration>
diff --git a/transport/allocator/1.0/vts/functional/VtsHidlAllocatorV1_0TargetTest.cpp b/transport/allocator/1.0/vts/functional/VtsHidlAllocatorV1_0TargetTest.cpp
index 39ce606..340ec0c 100644
--- a/transport/allocator/1.0/vts/functional/VtsHidlAllocatorV1_0TargetTest.cpp
+++ b/transport/allocator/1.0/vts/functional/VtsHidlAllocatorV1_0TargetTest.cpp
@@ -14,11 +14,12 @@
* limitations under the License.
*/
-#include <VtsHalHidlTargetTestBase.h>
-#include <VtsHalHidlTargetTestEnvBase.h>
#include <android-base/logging.h>
#include <android/hidl/allocator/1.0/IAllocator.h>
#include <android/hidl/memory/1.0/IMemory.h>
+#include <gtest/gtest.h>
+#include <hidl/GtestPrinter.h>
+#include <hidl/ServiceManagement.h>
#include <hidlmemory/mapping.h>
using ::android::sp;
@@ -32,20 +33,10 @@ using ::android::hidl::memory::V1_0::IMemory;
#define ASSERT_OK(ret) ASSERT_TRUE((ret).isOk())
#define EXPECT_OK(ret) EXPECT_TRUE((ret).isOk())
-class AllocatorEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
- public:
- virtual void registerTestServices() override { registerTestService<IAllocator>(); }
-
- static AllocatorEnvironment* instance() {
- static AllocatorEnvironment* instance = new AllocatorEnvironment();
- return instance;
- };
-};
-
-class AllocatorHidlTest : public ::testing::VtsHalHidlTargetTestBase {
- public:
+class AllocatorHidlTest : public ::testing::TestWithParam<std::string> {
+ public:
virtual void SetUp() override {
- allocator = getService<IAllocator>(AllocatorEnvironment::instance());
+ allocator = IAllocator::getService(GetParam());
ASSERT_NE(allocator, nullptr);
}
@@ -88,13 +79,13 @@ class AllocatorHidlTest : public ::testing::VtsHalHidlTargetTestBase {
sp<IAllocator> allocator;
};
-TEST_F(AllocatorHidlTest, TestAllocateSizes) {
+TEST_P(AllocatorHidlTest, TestAllocateSizes) {
for (size_t size : {1, 1023, 1024, 1025, 4096}) {
expectAllocateSuccess(size);
}
}
-TEST_F(AllocatorHidlTest, TestBatchAllocateSizes) {
+TEST_P(AllocatorHidlTest, TestBatchAllocateSizes) {
for (size_t count : {1, 1, 2, 3, 10}) {
for (size_t size : {1, 1023, 1024, 1025, 4096}) {
expectBatchAllocateSuccess(size, count);
@@ -102,7 +93,7 @@ TEST_F(AllocatorHidlTest, TestBatchAllocateSizes) {
}
}
-TEST_F(AllocatorHidlTest, TestCommit) {
+TEST_P(AllocatorHidlTest, TestCommit) {
constexpr size_t kSize = 1337;
sp<IMemory> memory = expectAllocateSuccess(kSize);
@@ -131,9 +122,7 @@ TEST_F(AllocatorHidlTest, TestCommit) {
}
}
-int main(int argc, char** argv) {
- ::testing::AddGlobalTestEnvironment(AllocatorEnvironment::instance());
- ::testing::InitGoogleTest(&argc, argv);
- AllocatorEnvironment::instance()->init(&argc, argv);
- return RUN_ALL_TESTS();
-}
+INSTANTIATE_TEST_SUITE_P(
+ PerInstance, AllocatorHidlTest,
+ testing::ValuesIn(android::hardware::getAllHalInstanceNames(IAllocator::descriptor)),
+ android::hardware::PrintInstanceNameToString);
diff --git a/transport/base/1.0/vts/functional/Android.bp b/transport/base/1.0/vts/functional/Android.bp
index 3f1c239..1c6e7ad 100644
--- a/transport/base/1.0/vts/functional/Android.bp
+++ b/transport/base/1.0/vts/functional/Android.bp
@@ -34,6 +34,7 @@ cc_test {
"libinit_test_utils",
],
test_suites: [
+ "general-tests",
"vts",
],
require_root: true,
diff --git a/transport/include/hidl/HidlBinderSupport.h b/transport/include/hidl/HidlBinderSupport.h
index 5dec5cd..f0981ff 100644
--- a/transport/include/hidl/HidlBinderSupport.h
+++ b/transport/include/hidl/HidlBinderSupport.h
@@ -204,13 +204,19 @@ sp<IType> fromBinder(const sp<IBinder>& binderIface) {
if (binderIface.get() == nullptr) {
return nullptr;
}
+
if (binderIface->localBinder() == nullptr) {
return new ProxyType(binderIface);
}
+
+ // Ensure that IBinder is BnHwBase (not JHwBinder, for instance)
+ if (!binderIface->checkSubclass(IBase::descriptor)) {
+ return new ProxyType(binderIface);
+ }
sp<IBase> base = static_cast<BnHwBase*>(binderIface.get())->getImpl();
+
if (details::canCastInterface(base.get(), IType::descriptor)) {
- StubType* stub = static_cast<StubType*>(binderIface.get());
- return stub->getImpl();
+ return static_cast<IType*>(base.get());
} else {
return nullptr;
}
diff --git a/transport/include/hidl/HidlLazyUtils.h b/transport/include/hidl/HidlLazyUtils.h
index 56d3fde..97fe20e 100644
--- a/transport/include/hidl/HidlLazyUtils.h
+++ b/transport/include/hidl/HidlLazyUtils.h
@@ -38,13 +38,13 @@ class LazyServiceRegistrarImpl;
**/
class LazyServiceRegistrar {
public:
- LazyServiceRegistrar();
static LazyServiceRegistrar& getInstance();
status_t registerService(const sp<::android::hidl::base::V1_0::IBase>& service,
const std::string& name = "default");
private:
std::shared_ptr<details::LazyServiceRegistrarImpl> mImpl;
+ LazyServiceRegistrar();
};
} // namespace hardware