Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7888b5cd authored by Martin Stjernholm's avatar Martin Stjernholm
Browse files

Avoid runtime namespace becoming parent for classloader-namespace.

Passing nullptr as parent namespace to android_create_namespace makes it use
the namespace of the caller as parent, which typically is the runtime
namespace. That in turn causes classloader-namespace to inherit any
libraries in the shared group of the runtime namespace, i.e. any libraries
that have been loaded in it with RTLD_GLOBAL or DF_1_GLOBAL up to that
point.

Let's instead pass the platform namespace from the linker config as fallback
when a parent namespace cannot be found. That is also what happened before
libnativeloader moved into the runtime namespace.

Test: Flash and boot
Test: atest CtsJniTestCases (on cuttlefish and taimen)
Bug: 124501296
Change-Id: If2faee74e2bdcf95d19516faec340fedcdd07e29
parent 4ac1829d
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -115,6 +115,8 @@ static constexpr const char* kVendorNamespaceName = "sphal";

static constexpr const char* kVndkNamespaceName = "vndk";

static constexpr const char* kDefaultNamespaceName = "default";
static constexpr const char* kPlatformNamespaceName = "platform";
static constexpr const char* kRuntimeNamespaceName = "runtime";

// classloader-namespace is a linker namespace that is created for the loaded
@@ -272,8 +274,19 @@ class LibraryNamespaces {

    NativeLoaderNamespace native_loader_ns;
    if (!is_native_bridge) {
      android_namespace_t* android_parent_ns =
          parent_ns == nullptr ? nullptr : parent_ns->get_android_ns();
      android_namespace_t* android_parent_ns;
      if (parent_ns != nullptr) {
        android_parent_ns = parent_ns->get_android_ns();
      } else {
        // Fall back to the platform namespace if no parent is found. It is
        // called "default" for binaries in /system and "platform" for those in
        // the Runtime APEX. Try "platform" first since "default" always exists.
        android_parent_ns = android_get_exported_namespace(kPlatformNamespaceName);
        if (android_parent_ns == nullptr) {
          android_parent_ns = android_get_exported_namespace(kDefaultNamespaceName);
        }
      }

      android_namespace_t* ns = android_create_namespace(namespace_name,
                                                         nullptr,
                                                         library_path.c_str(),
@@ -322,8 +335,16 @@ class LibraryNamespaces {

      native_loader_ns = NativeLoaderNamespace(ns);
    } else {
      native_bridge_namespace_t* native_bridge_parent_namespace =
          parent_ns == nullptr ? nullptr : parent_ns->get_native_bridge_ns();
      native_bridge_namespace_t* native_bridge_parent_namespace;
      if (parent_ns != nullptr) {
        native_bridge_parent_namespace = parent_ns->get_native_bridge_ns();
      } else {
        native_bridge_parent_namespace = NativeBridgeGetExportedNamespace(kPlatformNamespaceName);
        if (native_bridge_parent_namespace == nullptr) {
          native_bridge_parent_namespace = NativeBridgeGetExportedNamespace(kDefaultNamespaceName);
        }
      }

      native_bridge_namespace_t* ns = NativeBridgeCreateNamespace(namespace_name,
                                                                  nullptr,
                                                                  library_path.c_str(),