Reland "Check transport before registering."

This reverts commit eff97a8123278dcb42936f97a91e9ffff783ef63.

Reason for revert: relanding once manifests have been fixed.
Bug: 139274536
Test: boot emulator (that was failing before)
    no failed registrations
Test: passes boot health check on P1, P2, P3, P3a

Change-Id: Ie39c616298a7e9d14903019299cccdba194e872c
diff --git a/transport/ServiceManagement.cpp b/transport/ServiceManagement.cpp
index 357bb30..ab216ae 100644
--- a/transport/ServiceManagement.cpp
+++ b/transport/ServiceManagement.cpp
@@ -723,11 +723,32 @@
     return false;
 }
 
+#ifdef ENFORCE_VINTF_MANIFEST
+static constexpr bool kEnforceVintfManifest = true;
+#else
+static constexpr bool kEnforceVintfManifest = false;
+#endif
+
+#ifdef LIBHIDL_TARGET_DEBUGGABLE
+static constexpr bool kDebuggable = true;
+#else
+static constexpr bool kDebuggable = false;
+#endif
+
+static inline bool isTrebleTestingOverride() {
+    if (kEnforceVintfManifest && !kDebuggable) {
+        // don't allow testing override in production
+        return false;
+    }
+
+    const char* env = std::getenv("TREBLE_TESTING_OVERRIDE");
+    return env && !strcmp(env, "true");
+}
+
 sp<::android::hidl::base::V1_0::IBase> getRawServiceInternal(const std::string& descriptor,
                                                              const std::string& instance,
                                                              bool retry, bool getStub) {
-    using Transport = ::android::hidl::manager::V1_0::IServiceManager::Transport;
-    using ::android::hidl::manager::V1_0::IServiceManager;
+    using Transport = IServiceManager1_0::Transport;
     sp<Waiter> waiter;
 
     sp<IServiceManager1_1> sm;
@@ -753,30 +774,18 @@
 
     const bool vintfHwbinder = (transport == Transport::HWBINDER);
     const bool vintfPassthru = (transport == Transport::PASSTHROUGH);
+    const bool trebleTestingOverride = isTrebleTestingOverride();
+    const bool allowLegacy = !kEnforceVintfManifest || (trebleTestingOverride && kDebuggable);
+    const bool vintfLegacy = (transport == Transport::EMPTY) && allowLegacy;
 
-#ifdef ENFORCE_VINTF_MANIFEST
-
-#ifdef LIBHIDL_TARGET_DEBUGGABLE
-    const char* env = std::getenv("TREBLE_TESTING_OVERRIDE");
-    const bool trebleTestingOverride = env && !strcmp(env, "true");
-    const bool vintfLegacy = (transport == Transport::EMPTY) && trebleTestingOverride;
-#else   // ENFORCE_VINTF_MANIFEST but not LIBHIDL_TARGET_DEBUGGABLE
-    const bool trebleTestingOverride = false;
-    const bool vintfLegacy = false;
-#endif  // LIBHIDL_TARGET_DEBUGGABLE
-
-#else   // not ENFORCE_VINTF_MANIFEST
-    const char* env = std::getenv("TREBLE_TESTING_OVERRIDE");
-    const bool trebleTestingOverride = env && !strcmp(env, "true");
-    const bool vintfLegacy = (transport == Transport::EMPTY);
-
-    ALOGE("getService: Potential race detected. The VINTF manifest is not being enforced. If a HAL "
-          "server has a delay in starting and it is not in the manifest, it will not be retrieved. "
-          "Please make sure all HALs on this device are in the VINTF manifest and enable "
-          "PRODUCT_ENFORCE_VINTF_MANIFEST on this device (this is also enabled by "
-          "PRODUCT_FULL_TREBLE). PRODUCT_ENFORCE_VINTF_MANIFEST will ensure that no race condition "
-          "is possible here.");
-#endif  // ENFORCE_VINTF_MANIFEST
+    if (!kEnforceVintfManifest) {
+        ALOGE("getService: Potential race detected. The VINTF manifest is not being enforced. If "
+              "a HAL server has a delay in starting and it is not in the manifest, it will not be "
+              "retrieved. Please make sure all HALs on this device are in the VINTF manifest and "
+              "enable PRODUCT_ENFORCE_VINTF_MANIFEST on this device (this is also enabled by "
+              "PRODUCT_FULL_TREBLE). PRODUCT_ENFORCE_VINTF_MANIFEST will ensure that no race "
+              "condition is possible here.");
+    }
 
     for (int tries = 0; !getStub && (vintfHwbinder || vintfLegacy); tries++) {
         if (waiter == nullptr && tries > 0) {
@@ -820,7 +829,7 @@
     }
 
     if (getStub || vintfPassthru || vintfLegacy) {
-        const sp<IServiceManager> pm = getPassthroughServiceManager();
+        const sp<IServiceManager1_0> pm = getPassthroughServiceManager();
         if (pm != nullptr) {
             sp<IBase> base = pm->get(descriptor, instance).withDefault(nullptr);
             if (!getStub || trebleTestingOverride) {
@@ -843,6 +852,19 @@
         return INVALID_OPERATION;
     }
 
+    const std::string descriptor = getDescriptor(service.get());
+
+    if (kEnforceVintfManifest && !isTrebleTestingOverride()) {
+        using Transport = IServiceManager1_0::Transport;
+        Transport transport = sm->getTransport(descriptor, name);
+
+        if (transport != Transport::HWBINDER) {
+            LOG(ERROR) << "Service " << descriptor << "/" << name
+                       << " must be in VINTF manifest in order to register/get.";
+            return UNKNOWN_ERROR;
+        }
+    }
+
     bool registered = false;
     Return<void> ret = service->interfaceChain([&](const auto& chain) {
         registered = sm->addWithChain(name.c_str(), service, chain).withDefault(false);
@@ -853,7 +875,7 @@
     }
 
     if (registered) {
-        onRegistrationImpl(getDescriptor(service.get()), name);
+        onRegistrationImpl(descriptor, name);
     }
 
     return registered ? OK : UNKNOWN_ERROR;