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

Commit 980f233d authored by Evgenii Stepanov's avatar Evgenii Stepanov
Browse files

Pass MTE RuntimeFlags to AppZygote.

Fix AppZygote process and its children (the actual service processes)
ignoring android:memtagMode attribute in the app manifest.

When starting a new AppZygote process, apply memtag-related flags as
determined by the app manifest (and modified by compat features and
actual h/w capabilities). If this is not done, MTE is always disabled in
an AppZygote process, which makes it impossible to enable it in the
AppZygote's children.

This change has no effect unless MTE is supported in the hardware
(ARMv9) and enabled in the system.

Bug: 207557677
Test: CtsTaggingHostTestCases
Merged-In: Ibf64db8882a1fbffe6c0cc3cd3bc2299b088876a
Change-Id: Ibf64db8882a1fbffe6c0cc3cd3bc2299b088876a
(cherry picked from commit 2e50afbd)
parent 3a1a4dbf
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -45,6 +45,8 @@ public class AppZygote {
    // Last UID/GID of the range the AppZygote can setuid()/setgid() to
    private final int mZygoteUidGidMax;

    private final int mZygoteRuntimeFlags;

    private final Object mLock = new Object();

    /**
@@ -56,11 +58,13 @@ public class AppZygote {

    private final ApplicationInfo mAppInfo;

    public AppZygote(ApplicationInfo appInfo, int zygoteUid, int uidGidMin, int uidGidMax) {
    public AppZygote(ApplicationInfo appInfo, int zygoteUid, int uidGidMin, int uidGidMax,
            int runtimeFlags) {
        mAppInfo = appInfo;
        mZygoteUid = zygoteUid;
        mZygoteUidGidMin = uidGidMin;
        mZygoteUidGidMax = uidGidMax;
        mZygoteRuntimeFlags = runtimeFlags;
    }

    /**
@@ -110,7 +114,7 @@ public class AppZygote {
                    mZygoteUid,
                    mZygoteUid,
                    null,  // gids
                    0,  // runtimeFlags
                    mZygoteRuntimeFlags,  // runtimeFlags
                    "app_zygote",  // seInfo
                    abi,  // abi
                    abi, // acceptedAbiList
+22 −1
Original line number Diff line number Diff line
@@ -373,6 +373,16 @@ public final class ProcessList {
    @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q)
    private static final long NATIVE_HEAP_POINTER_TAGGING = 135754954; // This is a bug id.

    /**
     * Native heap allocations in AppZygote process and its descendants will now have a
     * non-zero tag in the most significant byte.
     * @see <a href="https://source.android.com/devices/tech/debug/tagged-pointers">Tagged
     * Pointers</a>
     */
    @ChangeId
    @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.S)
    private static final long NATIVE_HEAP_POINTER_TAGGING_APP_ZYGOTE = 207557677;

    /**
     * Enable asynchronous (ASYNC) memory tag checking in this process. This
     * flag will only have an effect on hardware supporting the ARM Memory
@@ -1738,6 +1748,16 @@ public final class ProcessList {
        return level;
    }

    private int decideTaggingLevelForAppZygote(ProcessRecord app) {
        int level = decideTaggingLevel(app);
        // TBI ("fake" pointer tagging) in AppZygote is controlled by a separate compat feature.
        if (!mPlatformCompat.isChangeEnabled(NATIVE_HEAP_POINTER_TAGGING_APP_ZYGOTE, app.info)
                && level == Zygote.MEMORY_TAG_LEVEL_TBI) {
            level = Zygote.MEMORY_TAG_LEVEL_NONE;
        }
        return level;
    }

    private int decideGwpAsanLevel(ProcessRecord app) {
        // Look at the process attribute first.
       if (app.processInfo != null
@@ -2238,7 +2258,8 @@ public final class ProcessList {
                // not the calling one.
                appInfo.packageName = app.getHostingRecord().getDefiningPackageName();
                appInfo.uid = uid;
                appZygote = new AppZygote(appInfo, uid, firstUid, lastUid);
                int runtimeFlags = decideTaggingLevelForAppZygote(app);
                appZygote = new AppZygote(appInfo, uid, firstUid, lastUid, runtimeFlags);
                mAppZygotes.put(app.info.processName, uid, appZygote);
                zygoteProcessList = new ArrayList<ProcessRecord>();
                mAppZygoteProcesses.put(appZygote, zygoteProcessList);