From 5e13a7307e36ae261a64abd2a834304aae66b879 Mon Sep 17 00:00:00 2001 From: Ulya Trafimovich Date: Tue, 3 Nov 2020 15:33:03 +0000 Subject: [PATCH] Disallow adding nested conditional class loader context. Nested conditional context doesn't make sense because conditional context is only needed for compatibility libraries, and those are only used by apps, and apps are always at the root of class loader context tree. Therefore, trying to add conditional nested context can only mean an error somewhere on the way. Test: lunch aosp_cf_x86_phone-userdebug && m Bug: 132357300 Change-Id: Iadeaaf89fdb11cb23b107c6fb074b1bc765256be --- dexpreopt/class_loader_context.go | 7 +++++++ dexpreopt/class_loader_context_test.go | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/dexpreopt/class_loader_context.go b/dexpreopt/class_loader_context.go index 8d6190190..2b6ec79bb 100644 --- a/dexpreopt/class_loader_context.go +++ b/dexpreopt/class_loader_context.go @@ -110,6 +110,13 @@ func (clcMap ClassLoaderContextMap) addContext(ctx android.ModuleInstallPathCont devicePath = android.InstallPathToOnDevicePath(ctx, installPath.(android.InstallPath)) } + // Nested class loader context shouldn't have conditional part (it is allowed only at the top level). + for ver, _ := range nestedClcMap { + if ver != AnySdkVersion { + clcStr, _ := ComputeClassLoaderContext(nestedClcMap) + return fmt.Errorf("nested class loader context shouldn't have conditional part: %s", clcStr) + } + } subcontexts := nestedClcMap[AnySdkVersion] // If the library with this name is already present as one of the unconditional top-level diff --git a/dexpreopt/class_loader_context_test.go b/dexpreopt/class_loader_context_test.go index 269a0dbc0..aed354367 100644 --- a/dexpreopt/class_loader_context_test.go +++ b/dexpreopt/class_loader_context_test.go @@ -194,6 +194,16 @@ func TestCLCMaybeAdd(t *testing.T) { }) } +// An attempt to add conditional nested subcontext should fail. +func TestCLCNestedConditional(t *testing.T) { + ctx := testContext() + m1 := make(ClassLoaderContextMap) + m1.AddContextForSdk(ctx, 42, "a", buildPath(ctx, "a"), installPath(ctx, "a"), nil) + m := make(ClassLoaderContextMap) + err := m.addContext(ctx, AnySdkVersion, "b", buildPath(ctx, "b"), installPath(ctx, "b"), true, m1) + checkError(t, err, "nested class loader context shouldn't have conditional part") +} + func checkError(t *testing.T, have error, want string) { if have == nil { t.Errorf("\nwant error: '%s'\nhave: none", want)