Merge "[CTS] [tagging] Skip zero-init tests on svelte devices." into sc-dev
diff --git a/hostsidetests/tagging/common/Android.bp b/hostsidetests/tagging/common/Android.bp
index 147cbde..2e3a4cd 100644
--- a/hostsidetests/tagging/common/Android.bp
+++ b/hostsidetests/tagging/common/Android.bp
@@ -35,6 +35,7 @@
     ],
     header_libs: ["jni_headers"],
     sdk_version: "current",
+    stl: "libc++",
     gtest: false,
 }
 
diff --git a/hostsidetests/tagging/common/jni/android_cts_tagging_Utils.cpp b/hostsidetests/tagging/common/jni/android_cts_tagging_Utils.cpp
index 05220eb..fc479c2 100644
--- a/hostsidetests/tagging/common/jni/android_cts_tagging_Utils.cpp
+++ b/hostsidetests/tagging/common/jni/android_cts_tagging_Utils.cpp
@@ -16,11 +16,15 @@
 
 #include <errno.h>
 #include <jni.h>
+#include <malloc.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/prctl.h>
 #include <sys/utsname.h>
 
+#include <string>
+
 extern "C" JNIEXPORT jboolean Java_android_cts_tagging_Utils_kernelSupportsTaggedPointers() {
 #ifdef __aarch64__
 #define PR_SET_TAGGED_ADDR_CTRL 55
@@ -81,3 +85,14 @@
 Java_android_cts_tagging_Utils_heapIsZeroInitialized(JNIEnv *) {
   return sizeIsZeroInitialized(100) && sizeIsZeroInitialized(2000) && sizeIsZeroInitialized(200000);
 }
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_tagging_Utils_allocatorIsScudo(JNIEnv *) {
+  const size_t kMallocInfoBufSize = 8192;
+  std::string buf;
+  buf.reserve(kMallocInfoBufSize);
+  FILE *fp = fmemopen(buf.data(), kMallocInfoBufSize, "w+");
+  malloc_info(0, fp);
+  fclose(fp);
+
+  return buf.find("<malloc version=\"scudo") != std::string::npos;
+}
diff --git a/hostsidetests/tagging/common/src/android/cts/tagging/Utils.java b/hostsidetests/tagging/common/src/android/cts/tagging/Utils.java
index 4f5e387..536b9f6 100644
--- a/hostsidetests/tagging/common/src/android/cts/tagging/Utils.java
+++ b/hostsidetests/tagging/common/src/android/cts/tagging/Utils.java
@@ -26,4 +26,5 @@
     public static native boolean mistaggedKernelUaccessFails();
 
     public static native boolean heapIsZeroInitialized();
+    public static native boolean allocatorIsScudo();
 }
diff --git a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/HeapZeroInitActivity.java b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/HeapZeroInitActivity.java
index 0ae44a8..3e87fc9 100644
--- a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/HeapZeroInitActivity.java
+++ b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/HeapZeroInitActivity.java
@@ -19,14 +19,21 @@
 import android.app.Activity;
 import android.cts.tagging.Utils;
 import android.os.Bundle;
-import android.util.Log;
 
 public class HeapZeroInitActivity extends Activity {
     @Override
     public void onCreate(Bundle bundle) {
         super.onCreate(bundle);
-        boolean result = Utils.heapIsZeroInitialized();
-        setResult(RESULT_FIRST_USER + (result ? 1 : 0));
+
+        if (!Utils.allocatorIsScudo()) {
+            // jemalloc doesn't support heap zero initialization. Skip this test.
+            setResult(TestActivity.RESULT_TEST_IGNORED);
+        } else if (Utils.heapIsZeroInitialized()) {
+            setResult(TestActivity.RESULT_TEST_SUCCESS);
+        } else {
+            setResult(TestActivity.RESULT_TEST_FAILED);
+        }
+
         finish();
     }
 }
diff --git a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/HeapZeroInitMemtagAsyncActivity.java b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/HeapZeroInitMemtagAsyncActivity.java
index 053681a..678141a 100644
--- a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/HeapZeroInitMemtagAsyncActivity.java
+++ b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/HeapZeroInitMemtagAsyncActivity.java
@@ -19,14 +19,21 @@
 import android.app.Activity;
 import android.cts.tagging.Utils;
 import android.os.Bundle;
-import android.util.Log;
 
 public class HeapZeroInitMemtagAsyncActivity extends Activity {
     @Override
     public void onCreate(Bundle bundle) {
         super.onCreate(bundle);
-        boolean result = Utils.heapIsZeroInitialized();
-        setResult(RESULT_FIRST_USER + (result ? 1 : 0));
+
+        if (!Utils.allocatorIsScudo()) {
+            // jemalloc doesn't support heap zero initialization. Skip this test.
+            setResult(TestActivity.RESULT_TEST_IGNORED);
+        } else if (Utils.heapIsZeroInitialized()) {
+            setResult(TestActivity.RESULT_TEST_SUCCESS);
+        } else {
+            setResult(TestActivity.RESULT_TEST_FAILED);
+        }
+
         finish();
     }
 }
diff --git a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TaggingTest.java b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TaggingTest.java
index cc5bf02..e8c50ff 100644
--- a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TaggingTest.java
+++ b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TaggingTest.java
@@ -145,14 +145,14 @@
     @Test
     public void testHeapZeroInitActivity() throws Exception {
       TestActivity activity = mTestActivityRule.getActivity();
-      boolean result = activity.callActivity(HeapZeroInitActivity.class);
-      assertTrue(result);
+      activity.callActivity(HeapZeroInitActivity.class);
+      assertFalse(activity.failed());
     }
 
     @Test
     public void testHeapZeroInitMemtagAsyncActivity() throws Exception {
       TestActivity activity = mTestActivityRule.getActivity();
-      boolean result = activity.callActivity(HeapZeroInitMemtagAsyncActivity.class);
-      assertTrue(result);
+      activity.callActivity(HeapZeroInitMemtagAsyncActivity.class);
+      assertFalse(activity.failed());
     }
 }
diff --git a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TestActivity.java b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TestActivity.java
index ec099af..b9112e4 100644
--- a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TestActivity.java
+++ b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TestActivity.java
@@ -30,6 +30,10 @@
 public class TestActivity extends Activity {
     static final String TAG = "TestActivity";
 
+    public static final int RESULT_TEST_SUCCESS = RESULT_FIRST_USER + 1;
+    public static final int RESULT_TEST_IGNORED = RESULT_FIRST_USER + 2;
+    public static final int RESULT_TEST_FAILED = RESULT_FIRST_USER + 3;
+
     private int mResult;
     private final Object mFinishEvent = new Object();
 
@@ -46,7 +50,11 @@
         }
     }
 
-    public boolean callActivity(Class<?> cls) throws Exception {
+    public boolean failed() {
+        return mResult != RESULT_TEST_SUCCESS && mResult != RESULT_TEST_IGNORED;
+    }
+
+    public void callActivity(Class<?> cls) throws Exception {
         Thread thread = new Thread() {
             @Override
             public void run() {
@@ -65,10 +73,5 @@
         };
         thread.start();
         thread.join(50000 /* millis */);
-
-        if (mResult == RESULT_OK) {
-          throw new Exception();
-        }
-        return (mResult - RESULT_FIRST_USER) == 1;
     }
 }
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk30Test.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk30Test.java
index b6510d7..2c3bec0 100644
--- a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk30Test.java
+++ b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk30Test.java
@@ -146,12 +146,16 @@
     }
 
     public void testHeapZeroInitActivity() throws Exception {
+        // Note, only Scudo supports heap zero initialization. This test is
+        // effectively a no-op on jemalloc devices.
         runDeviceCompatTest(TEST_PKG, ".TaggingTest", "testHeapZeroInitActivity",
                 /*enabledChanges*/ ImmutableSet.of(),
                 /*disabledChanges*/ ImmutableSet.of());
     }
 
     public void testHeapZeroInitMemtagAsyncActivity() throws Exception {
+        // Note, only Scudo supports heap zero initialization. This test is
+        // effectively a no-op on jemalloc devices.
         runDeviceCompatTest(TEST_PKG, ".TaggingTest", "testHeapZeroInitMemtagAsyncActivity",
                 /*enabledChanges*/ ImmutableSet.of(),
                 /*disabledChanges*/ ImmutableSet.of());