Merge "Token Manager: use arbitrarily sized tokens." into oc-dev
diff --git a/base/include/hidl/Status.h b/base/include/hidl/Status.h
index a4a83f4..a04cf77 100644
--- a/base/include/hidl/Status.h
+++ b/base/include/hidl/Status.h
@@ -21,6 +21,7 @@
#include <sstream>
#include <android-base/macros.h>
+#include <hidl/HidlInternal.h>
#include <utils/Errors.h>
#include <utils/StrongPointer.h>
@@ -129,11 +130,16 @@
// For gtest output logging
std::ostream& operator<< (std::ostream& stream, const Status& s);
+template<typename T> class Return;
+
namespace details {
class return_status {
private:
Status mStatus {};
mutable bool mCheckedStatus = false;
+
+ template <typename T, typename U>
+ friend Return<U> StatusOf(const Return<T> &other);
protected:
void assertOk() const;
public:
@@ -155,6 +161,12 @@
return mStatus.isOk();
}
+ // Check if underlying error is DEAD_OBJECT.
+ // Does not set mCheckedStatus.
+ bool isDeadObject() const {
+ return mStatus.transactionError() == DEAD_OBJECT;
+ }
+
// For debugging purposes only
std::string description() const {
// Doesn't consider checked.
@@ -229,6 +241,18 @@
return Return<void>();
}
+namespace details {
+// Create a Return<U> from the Status of Return<T>. The provided
+// Return<T> must have an error status and have it checked.
+template <typename T, typename U>
+Return<U> StatusOf(const Return<T> &other) {
+ if (other.mStatus.isOk() || !other.mCheckedStatus) {
+ details::logAlwaysFatal("cannot call statusOf on an OK Status or an unchecked status");
+ }
+ return Return<U>{other.mStatus};
+}
+} // namespace details
+
} // namespace hardware
} // namespace android
diff --git a/manifest.xml b/manifest.xml
index c4fd16f..db83d63 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -44,4 +44,13 @@
<instance>default</instance>
</interface>
</hal>
+ <hal>
+ <name>android.system.wifi.keystore</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IKeystore</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
</manifest>
diff --git a/transport/Android.bp b/transport/Android.bp
index f81d9c6..835c6e1 100644
--- a/transport/Android.bp
+++ b/transport/Android.bp
@@ -60,7 +60,6 @@
"HidlBinderSupport.cpp",
"HidlPassthroughSupport.cpp",
"HidlTransportSupport.cpp",
- "LegacySupport.cpp",
"ServiceManagement.cpp",
"Static.cpp"
],
diff --git a/transport/LegacySupport.cpp b/transport/LegacySupport.cpp
deleted file mode 100644
index ae02928..0000000
--- a/transport/LegacySupport.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-#define LOG_TAG "libhidltransport"
-
-#include <inttypes.h>
-
-#include <hidl/LegacySupport.h>
-
-#include <chrono>
-#include <thread>
-#include <utils/misc.h>
-#include <utils/Log.h>
-#include <utils/SystemClock.h>
-
-#include <android-base/properties.h>
-
-namespace android {
-namespace hardware {
-
-namespace details {
-
-using android::base::GetBoolProperty;
-using android::base::WaitForPropertyCreation;
-
-static const char* kPersistPropReadyProperty = "ro.persistent_properties.ready";
-static const char* kBinderizationProperty = "persist.hal.binderization";
-
-bool blockingHalBinderizationEnabled() {
- if (!GetBoolProperty(kPersistPropReadyProperty, false)) { // not set yet
- int64_t startTime = elapsedRealtime();
- WaitForPropertyCreation(kPersistPropReadyProperty, std::chrono::milliseconds::max());
- ALOGI("Waiting for %s took %" PRId64 " ms", kPersistPropReadyProperty,
- elapsedRealtime() - startTime);
- }
- return GetBoolProperty(kBinderizationProperty, false);
-}
-
-void blockIfBinderizationDisabled(const std::string& interface,
- const std::string& instance) {
- // TODO(b/34274385) remove this
-
- size_t loc = interface.find_first_of("@");
- if (loc == std::string::npos) {
- LOG_ALWAYS_FATAL("Bad interface name: %s", interface.c_str());
- }
- std::string package = interface.substr(0, loc);
-
- // only block if this is supposed to be toggled
- if (getTransport(interface, instance) != vintf::Transport::TOGGLED) {
- return;
- }
-
- // Must wait for data to be mounted and persistant properties to be read,
- // but only delay the start of hals which require reading this property.
- bool enabled = blockingHalBinderizationEnabled();
-
- if (!enabled) {
- ALOGI("Deactivating %s/%s binderized service to"
- " yield to passthrough implementation.",
- interface.c_str(),
- instance.c_str());
- while (true) {
- sleep(UINT_MAX);
- }
- }
-}
-} // namespace details
-
-} // namespace hardware
-} // namespace android
diff --git a/transport/include/hidl/HidlTransportSupport.h b/transport/include/hidl/HidlTransportSupport.h
index 8a2a70a..3cac1e9 100644
--- a/transport/include/hidl/HidlTransportSupport.h
+++ b/transport/include/hidl/HidlTransportSupport.h
@@ -50,16 +50,28 @@
namespace details {
// cast the interface IParent to IChild.
-// Return nullptr if parent is null or any failure.
+// Return nonnull if cast successful.
+// Return nullptr if:
+// 1. parent is null
+// 2. cast failed because IChild is not a child type of IParent.
+// 3. !emitError, calling into parent fails.
+// Return an error Return object if:
+// 1. emitError, calling into parent fails.
template<typename IChild, typename IParent, typename BpChild, typename BpParent>
-sp<IChild> castInterface(sp<IParent> parent, const char *childIndicator) {
+Return<sp<IChild>> castInterface(sp<IParent> parent, const char *childIndicator, bool emitError) {
if (parent.get() == nullptr) {
// casts always succeed with nullptrs.
return nullptr;
}
- bool canCast = details::canCastInterface(parent.get(), childIndicator);
+ Return<bool> canCastRet = details::canCastInterface(parent.get(), childIndicator, emitError);
+ if (!canCastRet.isOk()) {
+ // call fails, propagate the error if emitError
+ return emitError
+ ? details::StatusOf<bool, sp<IChild>>(canCastRet)
+ : Return<sp<IChild>>(sp<IChild>(nullptr));
+ }
- if (!canCast) {
+ if (!canCastRet) {
return sp<IChild>(nullptr); // cast failed.
}
// TODO b/32001926 Needs to be fixed for socket mode.
diff --git a/transport/include/hidl/HidlTransportUtils.h b/transport/include/hidl/HidlTransportUtils.h
index 0fe70c4..fbd6516 100644
--- a/transport/include/hidl/HidlTransportUtils.h
+++ b/transport/include/hidl/HidlTransportUtils.h
@@ -25,14 +25,17 @@
/*
* Verifies the interface chain of 'interface' contains 'castTo'
+ * @param emitError if emitError is false, return Return<bool>{false} on error; if emitError
+ * is true, the Return<bool> object contains the actual error.
*/
-inline bool canCastInterface(::android::hidl::base::V1_0::IBase* interface, const char* castTo) {
+inline Return<bool> canCastInterface(::android::hidl::base::V1_0::IBase* interface,
+ const char* castTo, bool emitError = false) {
if (interface == nullptr) {
return false;
}
bool canCast = false;
- auto ret = interface->interfaceChain([&](const hidl_vec<hidl_string> &types) {
+ auto chainRet = interface->interfaceChain([&](const hidl_vec<hidl_string> &types) {
for (size_t i = 0; i < types.size(); i++) {
if (types[i] == castTo) {
canCast = true;
@@ -40,7 +43,15 @@
}
}
});
- return ret.isOk() && canCast;
+
+ if (!chainRet.isOk()) {
+ // call fails, propagate the error if emitError
+ return emitError
+ ? details::StatusOf<void, bool>(chainRet)
+ : Return<bool>(false);
+ }
+
+ return canCast;
}
inline std::string getDescriptor(::android::hidl::base::V1_0::IBase* interface) {
diff --git a/transport/include/hidl/LegacySupport.h b/transport/include/hidl/LegacySupport.h
index efe4d92..2f0c3f3 100644
--- a/transport/include/hidl/LegacySupport.h
+++ b/transport/include/hidl/LegacySupport.h
@@ -26,12 +26,6 @@
namespace android {
namespace hardware {
-namespace details {
-bool blockingHalBinderizationEnabled();
-void blockIfBinderizationDisabled(const std::string& interface,
- const std::string& instance);
-} // namespace details
-
/**
* Registers passthrough service implementation.
*/
@@ -39,13 +33,6 @@
__attribute__((warn_unused_result))
status_t registerPassthroughServiceImplementation(
std::string name = "default") {
- // TODO(b/34274385)
- // If binderization is enabled, we should start up. Otherwise, wait around.
- // If we return/kill ourselves, we will just be restarted by init. This
- // function is only called from thin wrapping services, so blocking won't
- // stop anything important from happening.
- details::blockIfBinderizationDisabled(Interface::descriptor, name);
-
sp<Interface> service = Interface::getService(name, true /* getStub */);
if (service == nullptr) {