Merge "Cleanup nativeHeapZeroInit and memtagMode implementation."

This commit is contained in:
Aurimas Liutikas
2021-04-19 16:52:58 +00:00
committed by Gerrit Code Review
14 changed files with 175 additions and 87 deletions

View File

@@ -978,7 +978,7 @@ package android {
field public static final int multiArch = 16843918; // 0x101048e field public static final int multiArch = 16843918; // 0x101048e
field public static final int multiprocess = 16842771; // 0x1010013 field public static final int multiprocess = 16842771; // 0x1010013
field public static final int name = 16842755; // 0x1010003 field public static final int name = 16842755; // 0x1010003
field public static final int nativeHeapZeroInit = 16844314; // 0x101061a field public static final int nativeHeapZeroInitialized = 16844314; // 0x101061a
field public static final int navigationBarColor = 16843858; // 0x1010452 field public static final int navigationBarColor = 16843858; // 0x1010452
field public static final int navigationBarDividerColor = 16844141; // 0x101056d field public static final int navigationBarDividerColor = 16844141; // 0x101056d
field public static final int navigationContentDescription = 16843969; // 0x10104c1 field public static final int navigationContentDescription = 16843969; // 0x10104c1
@@ -11466,7 +11466,7 @@ package android.content.pm {
method public static CharSequence getCategoryTitle(android.content.Context, int); method public static CharSequence getCategoryTitle(android.content.Context, int);
method public int getGwpAsanMode(); method public int getGwpAsanMode();
method public int getMemtagMode(); method public int getMemtagMode();
method @Nullable public Boolean isNativeHeapZeroInit(); method public int getNativeHeapZeroInitialized();
method public boolean isProfileableByShell(); method public boolean isProfileableByShell();
method public boolean isResourceOverlay(); method public boolean isResourceOverlay();
method public boolean isVirtualPreload(); method public boolean isVirtualPreload();
@@ -11520,6 +11520,9 @@ package android.content.pm {
field public static final int MEMTAG_DEFAULT = -1; // 0xffffffff field public static final int MEMTAG_DEFAULT = -1; // 0xffffffff
field public static final int MEMTAG_OFF = 0; // 0x0 field public static final int MEMTAG_OFF = 0; // 0x0
field public static final int MEMTAG_SYNC = 2; // 0x2 field public static final int MEMTAG_SYNC = 2; // 0x2
field public static final int ZEROINIT_DEFAULT = -1; // 0xffffffff
field public static final int ZEROINIT_DISABLED = 0; // 0x0
field public static final int ZEROINIT_ENABLED = 1; // 0x1
field public String appComponentFactory; field public String appComponentFactory;
field public String backupAgentName; field public String backupAgentName;
field public int category; field public int category;

View File

@@ -1337,7 +1337,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
* Indicates if the application has requested GWP-ASan to be enabled, disabled, or left * Indicates if the application has requested GWP-ASan to be enabled, disabled, or left
* unspecified. Processes can override this setting. * unspecified. Processes can override this setting.
*/ */
private @GwpAsanMode int gwpAsanMode; private @GwpAsanMode int gwpAsanMode = GWP_ASAN_DEFAULT;
/** /**
* Default (unspecified) setting of Memtag. * Default (unspecified) setting of Memtag.
@@ -1376,13 +1376,38 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
* Indicates if the application has requested Memtag to be enabled, disabled, or left * Indicates if the application has requested Memtag to be enabled, disabled, or left
* unspecified. Processes can override this setting. * unspecified. Processes can override this setting.
*/ */
private @MemtagMode int memtagMode; private @MemtagMode int memtagMode = MEMTAG_DEFAULT;
/**
* Default (unspecified) setting of nativeHeapZeroInitialized.
*/
public static final int ZEROINIT_DEFAULT = -1;
/**
* Disable zero-initialization of the native heap in this application or process.
*/
public static final int ZEROINIT_DISABLED = 0;
/**
* Enable zero-initialization of the native heap in this application or process.
*/
public static final int ZEROINIT_ENABLED = 1;
/**
* @hide
*/
@IntDef(prefix = {"ZEROINIT_"}, value = {
ZEROINIT_DEFAULT,
ZEROINIT_DISABLED,
ZEROINIT_ENABLED,
})
@Retention(RetentionPolicy.SOURCE)
public @interface NativeHeapZeroInitialized {}
/** /**
* Enable automatic zero-initialization of native heap memory allocations. * Enable automatic zero-initialization of native heap memory allocations.
*/ */
@Nullable private @NativeHeapZeroInitialized int nativeHeapZeroInitialized = ZEROINIT_DEFAULT;
private Boolean nativeHeapZeroInit;
/** /**
* Represents the default policy. The actual policy used will depend on other properties of * Represents the default policy. The actual policy used will depend on other properties of
@@ -1531,8 +1556,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
if (memtagMode != MEMTAG_DEFAULT) { if (memtagMode != MEMTAG_DEFAULT) {
pw.println(prefix + "memtagMode=" + memtagMode); pw.println(prefix + "memtagMode=" + memtagMode);
} }
if (nativeHeapZeroInit != null) { if (nativeHeapZeroInitialized != ZEROINIT_DEFAULT) {
pw.println(prefix + "nativeHeapZeroInit=" + nativeHeapZeroInit); pw.println(prefix + "nativeHeapZeroInitialized=" + nativeHeapZeroInitialized);
} }
} }
super.dumpBack(pw, prefix); super.dumpBack(pw, prefix);
@@ -1638,8 +1663,9 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
if (memtagMode != MEMTAG_DEFAULT) { if (memtagMode != MEMTAG_DEFAULT) {
proto.write(ApplicationInfoProto.Detail.ENABLE_MEMTAG, memtagMode); proto.write(ApplicationInfoProto.Detail.ENABLE_MEMTAG, memtagMode);
} }
if (nativeHeapZeroInit != null) { if (nativeHeapZeroInitialized != ZEROINIT_DEFAULT) {
proto.write(ApplicationInfoProto.Detail.NATIVE_HEAP_ZERO_INIT, nativeHeapZeroInit); proto.write(ApplicationInfoProto.Detail.NATIVE_HEAP_ZERO_INIT,
nativeHeapZeroInitialized);
} }
proto.end(detailToken); proto.end(detailToken);
} }
@@ -1752,7 +1778,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
zygotePreloadName = orig.zygotePreloadName; zygotePreloadName = orig.zygotePreloadName;
gwpAsanMode = orig.gwpAsanMode; gwpAsanMode = orig.gwpAsanMode;
memtagMode = orig.memtagMode; memtagMode = orig.memtagMode;
nativeHeapZeroInit = orig.nativeHeapZeroInit; nativeHeapZeroInitialized = orig.nativeHeapZeroInitialized;
} }
public String toString() { public String toString() {
@@ -1838,7 +1864,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
dest.writeString8(zygotePreloadName); dest.writeString8(zygotePreloadName);
dest.writeInt(gwpAsanMode); dest.writeInt(gwpAsanMode);
dest.writeInt(memtagMode); dest.writeInt(memtagMode);
sForBoolean.parcel(nativeHeapZeroInit, dest, parcelableFlags); dest.writeInt(nativeHeapZeroInitialized);
} }
public static final @android.annotation.NonNull Parcelable.Creator<ApplicationInfo> CREATOR public static final @android.annotation.NonNull Parcelable.Creator<ApplicationInfo> CREATOR
@@ -1921,7 +1947,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
zygotePreloadName = source.readString8(); zygotePreloadName = source.readString8();
gwpAsanMode = source.readInt(); gwpAsanMode = source.readInt();
memtagMode = source.readInt(); memtagMode = source.readInt();
nativeHeapZeroInit = sForBoolean.unparcel(source); nativeHeapZeroInitialized = source.readInt();
} }
/** /**
@@ -2314,7 +2340,9 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
/** {@hide} */ public void setSplitResourcePaths(String[] splitResourcePaths) { splitPublicSourceDirs = splitResourcePaths; } /** {@hide} */ public void setSplitResourcePaths(String[] splitResourcePaths) { splitPublicSourceDirs = splitResourcePaths; }
/** {@hide} */ public void setGwpAsanMode(@GwpAsanMode int value) { gwpAsanMode = value; } /** {@hide} */ public void setGwpAsanMode(@GwpAsanMode int value) { gwpAsanMode = value; }
/** {@hide} */ public void setMemtagMode(@MemtagMode int value) { memtagMode = value; } /** {@hide} */ public void setMemtagMode(@MemtagMode int value) { memtagMode = value; }
/** {@hide} */ public void setNativeHeapZeroInit(@Nullable Boolean value) { nativeHeapZeroInit = value; } /** {@hide} */ public void setNativeHeapZeroInitialized(@NativeHeapZeroInitialized int value) {
nativeHeapZeroInitialized = value;
}
/** {@hide} */ /** {@hide} */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@@ -2328,8 +2356,22 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
/** {@hide} */ public String[] getSplitResourcePaths() { return splitPublicSourceDirs; } /** {@hide} */ public String[] getSplitResourcePaths() { return splitPublicSourceDirs; }
@GwpAsanMode @GwpAsanMode
public int getGwpAsanMode() { return gwpAsanMode; } public int getGwpAsanMode() { return gwpAsanMode; }
/**
* Returns whether the application has requested Memtag to be enabled, disabled, or left
* unspecified. Processes can override this setting.
*/
@MemtagMode @MemtagMode
public int getMemtagMode() { return memtagMode; } public int getMemtagMode() {
@Nullable return memtagMode;
public Boolean isNativeHeapZeroInit() { return nativeHeapZeroInit; } }
/**
* Returns whether the application has requested automatic zero-initialization of native heap
* memory allocations to be enabled or disabled.
*/
@NativeHeapZeroInitialized
public int getNativeHeapZeroInitialized() {
return nativeHeapZeroInitialized;
}
} }

View File

@@ -62,8 +62,7 @@ public class ProcessInfo implements Parcelable {
/** /**
* Enable automatic zero-initialization of native heap memory allocations. * Enable automatic zero-initialization of native heap memory allocations.
*/ */
@Nullable public @ApplicationInfo.NativeHeapZeroInitialized int nativeHeapZeroInitialized;
public Boolean nativeHeapZeroInit;
@Deprecated @Deprecated
public ProcessInfo(@NonNull ProcessInfo orig) { public ProcessInfo(@NonNull ProcessInfo orig) {
@@ -71,7 +70,7 @@ public class ProcessInfo implements Parcelable {
this.deniedPermissions = orig.deniedPermissions; this.deniedPermissions = orig.deniedPermissions;
this.gwpAsanMode = orig.gwpAsanMode; this.gwpAsanMode = orig.gwpAsanMode;
this.memtagMode = orig.memtagMode; this.memtagMode = orig.memtagMode;
this.nativeHeapZeroInit = orig.nativeHeapZeroInit; this.nativeHeapZeroInitialized = orig.nativeHeapZeroInitialized;
} }
@@ -101,7 +100,7 @@ public class ProcessInfo implements Parcelable {
* @param memtagMode * @param memtagMode
* Indicates if the process has requested Memtag to be enabled (in sync or async mode), * Indicates if the process has requested Memtag to be enabled (in sync or async mode),
* disabled, or left unspecified. * disabled, or left unspecified.
* @param nativeHeapZeroInit * @param nativeHeapZeroInitialized
* Enable automatic zero-initialization of native heap memory allocations. * Enable automatic zero-initialization of native heap memory allocations.
*/ */
@DataClass.Generated.Member @DataClass.Generated.Member
@@ -110,7 +109,7 @@ public class ProcessInfo implements Parcelable {
@Nullable ArraySet<String> deniedPermissions, @Nullable ArraySet<String> deniedPermissions,
@ApplicationInfo.GwpAsanMode int gwpAsanMode, @ApplicationInfo.GwpAsanMode int gwpAsanMode,
@ApplicationInfo.MemtagMode int memtagMode, @ApplicationInfo.MemtagMode int memtagMode,
@Nullable Boolean nativeHeapZeroInit) { @ApplicationInfo.NativeHeapZeroInitialized int nativeHeapZeroInitialized) {
this.name = name; this.name = name;
com.android.internal.util.AnnotationValidations.validate( com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, name); NonNull.class, null, name);
@@ -121,7 +120,9 @@ public class ProcessInfo implements Parcelable {
this.memtagMode = memtagMode; this.memtagMode = memtagMode;
com.android.internal.util.AnnotationValidations.validate( com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.MemtagMode.class, null, memtagMode); ApplicationInfo.MemtagMode.class, null, memtagMode);
this.nativeHeapZeroInit = nativeHeapZeroInit; this.nativeHeapZeroInitialized = nativeHeapZeroInitialized;
com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.NativeHeapZeroInitialized.class, null, nativeHeapZeroInitialized);
// onConstructed(); // You can define this method to get a callback // onConstructed(); // You can define this method to get a callback
} }
@@ -145,13 +146,12 @@ public class ProcessInfo implements Parcelable {
byte flg = 0; byte flg = 0;
if (deniedPermissions != null) flg |= 0x2; if (deniedPermissions != null) flg |= 0x2;
if (nativeHeapZeroInit != null) flg |= 0x10;
dest.writeByte(flg); dest.writeByte(flg);
dest.writeString(name); dest.writeString(name);
sParcellingForDeniedPermissions.parcel(deniedPermissions, dest, flags); sParcellingForDeniedPermissions.parcel(deniedPermissions, dest, flags);
dest.writeInt(gwpAsanMode); dest.writeInt(gwpAsanMode);
dest.writeInt(memtagMode); dest.writeInt(memtagMode);
if (nativeHeapZeroInit != null) dest.writeBoolean(nativeHeapZeroInit); dest.writeInt(nativeHeapZeroInitialized);
} }
@Override @Override
@@ -170,7 +170,7 @@ public class ProcessInfo implements Parcelable {
ArraySet<String> _deniedPermissions = sParcellingForDeniedPermissions.unparcel(in); ArraySet<String> _deniedPermissions = sParcellingForDeniedPermissions.unparcel(in);
int _gwpAsanMode = in.readInt(); int _gwpAsanMode = in.readInt();
int _memtagMode = in.readInt(); int _memtagMode = in.readInt();
Boolean _nativeHeapZeroInit = (flg & 0x10) == 0 ? null : (Boolean) in.readBoolean(); int _nativeHeapZeroInitialized = in.readInt();
this.name = _name; this.name = _name;
com.android.internal.util.AnnotationValidations.validate( com.android.internal.util.AnnotationValidations.validate(
@@ -182,7 +182,9 @@ public class ProcessInfo implements Parcelable {
this.memtagMode = _memtagMode; this.memtagMode = _memtagMode;
com.android.internal.util.AnnotationValidations.validate( com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.MemtagMode.class, null, memtagMode); ApplicationInfo.MemtagMode.class, null, memtagMode);
this.nativeHeapZeroInit = _nativeHeapZeroInit; this.nativeHeapZeroInitialized = _nativeHeapZeroInitialized;
com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.NativeHeapZeroInitialized.class, null, nativeHeapZeroInitialized);
// onConstructed(); // You can define this method to get a callback // onConstructed(); // You can define this method to get a callback
} }
@@ -202,10 +204,10 @@ public class ProcessInfo implements Parcelable {
}; };
@DataClass.Generated( @DataClass.Generated(
time = 1611614699049L, time = 1615850184524L,
codegenVersion = "1.0.22", codegenVersion = "1.0.22",
sourceFile = "frameworks/base/core/java/android/content/pm/ProcessInfo.java", sourceFile = "frameworks/base/core/java/android/content/pm/ProcessInfo.java",
inputSignatures = "public @android.annotation.NonNull java.lang.String name\npublic @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedStringArraySet.class) android.util.ArraySet<java.lang.String> deniedPermissions\npublic @android.content.pm.ApplicationInfo.GwpAsanMode int gwpAsanMode\npublic @android.content.pm.ApplicationInfo.MemtagMode int memtagMode\npublic @android.annotation.Nullable java.lang.Boolean nativeHeapZeroInit\nclass ProcessInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genGetters=true, genSetters=false, genParcelable=true, genAidl=false, genBuilder=false)") inputSignatures = "public @android.annotation.NonNull java.lang.String name\npublic @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedStringArraySet.class) android.util.ArraySet<java.lang.String> deniedPermissions\npublic @android.content.pm.ApplicationInfo.GwpAsanMode int gwpAsanMode\npublic @android.content.pm.ApplicationInfo.MemtagMode int memtagMode\npublic @android.content.pm.ApplicationInfo.NativeHeapZeroInitialized int nativeHeapZeroInitialized\nclass ProcessInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genGetters=true, genSetters=false, genParcelable=true, genAidl=false, genBuilder=false)")
@Deprecated @Deprecated
private void __metadata() {} private void __metadata() {}

View File

@@ -19,6 +19,7 @@ package android.content.pm.parsing;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo; import android.content.pm.ConfigurationInfo;
import android.content.pm.FeatureGroupInfo; import android.content.pm.FeatureGroupInfo;
import android.content.pm.FeatureInfo; import android.content.pm.FeatureInfo;
@@ -239,11 +240,12 @@ public interface ParsingPackage extends ParsingPackageRead {
ParsingPackage setEnabled(boolean enabled); ParsingPackage setEnabled(boolean enabled);
ParsingPackage setGwpAsanMode(int gwpAsanMode); ParsingPackage setGwpAsanMode(@ApplicationInfo.GwpAsanMode int gwpAsanMode);
ParsingPackage setMemtagMode(int memtagMode); ParsingPackage setMemtagMode(@ApplicationInfo.MemtagMode int memtagMode);
ParsingPackage setNativeHeapZeroInit(@Nullable Boolean nativeHeapZeroInit); ParsingPackage setNativeHeapZeroInitialized(
@ApplicationInfo.NativeHeapZeroInitialized int nativeHeapZeroInitialized);
ParsingPackage setCrossProfile(boolean crossProfile); ParsingPackage setCrossProfile(boolean crossProfile);

View File

@@ -417,12 +417,14 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
private int autoRevokePermissions; private int autoRevokePermissions;
private boolean preserveLegacyExternalStorage; private boolean preserveLegacyExternalStorage;
protected int gwpAsanMode; @ApplicationInfo.GwpAsanMode
protected int memtagMode; private int gwpAsanMode;
@Nullable @ApplicationInfo.MemtagMode
@DataClass.ParcelWith(ForBoolean.class) private int memtagMode;
private Boolean nativeHeapZeroInit;
@ApplicationInfo.NativeHeapZeroInitialized
private int nativeHeapZeroInitialized;
// TODO(chiuwinson): Non-null // TODO(chiuwinson): Non-null
@Nullable @Nullable
@@ -934,7 +936,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
appInfo.crossProfile = isCrossProfile(); appInfo.crossProfile = isCrossProfile();
appInfo.setGwpAsanMode(gwpAsanMode); appInfo.setGwpAsanMode(gwpAsanMode);
appInfo.setMemtagMode(memtagMode); appInfo.setMemtagMode(memtagMode);
appInfo.setNativeHeapZeroInit(nativeHeapZeroInit); appInfo.setNativeHeapZeroInitialized(nativeHeapZeroInitialized);
appInfo.setBaseCodePath(baseCodePath); appInfo.setBaseCodePath(baseCodePath);
appInfo.setBaseResourcePath(baseCodePath); appInfo.setBaseResourcePath(baseCodePath);
appInfo.setCodePath(codePath); appInfo.setCodePath(codePath);
@@ -1121,7 +1123,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
dest.writeInt(this.gwpAsanMode); dest.writeInt(this.gwpAsanMode);
dest.writeSparseIntArray(this.minExtensionVersions); dest.writeSparseIntArray(this.minExtensionVersions);
dest.writeInt(this.memtagMode); dest.writeInt(this.memtagMode);
sForBoolean.parcel(this.nativeHeapZeroInit, dest, flags); dest.writeInt(this.nativeHeapZeroInitialized);
} }
public ParsingPackageImpl(Parcel in) { public ParsingPackageImpl(Parcel in) {
@@ -1284,7 +1286,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
this.gwpAsanMode = in.readInt(); this.gwpAsanMode = in.readInt();
this.minExtensionVersions = in.readSparseIntArray(); this.minExtensionVersions = in.readSparseIntArray();
this.memtagMode = in.readInt(); this.memtagMode = in.readInt();
this.nativeHeapZeroInit = sForBoolean.unparcel(in); this.nativeHeapZeroInitialized = in.readInt();
} }
public static final Parcelable.Creator<ParsingPackageImpl> CREATOR = public static final Parcelable.Creator<ParsingPackageImpl> CREATOR =
@@ -2012,20 +2014,22 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
return directBootAware; return directBootAware;
} }
@ApplicationInfo.GwpAsanMode
@Override @Override
public int getGwpAsanMode() { public int getGwpAsanMode() {
return gwpAsanMode; return gwpAsanMode;
} }
@ApplicationInfo.MemtagMode
@Override @Override
public int getMemtagMode() { public int getMemtagMode() {
return memtagMode; return memtagMode;
} }
@Nullable @ApplicationInfo.NativeHeapZeroInitialized
@Override @Override
public Boolean isNativeHeapZeroInit() { public int getNativeHeapZeroInitialized() {
return nativeHeapZeroInit; return nativeHeapZeroInitialized;
} }
@Override @Override
@@ -2495,20 +2499,21 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
} }
@Override @Override
public ParsingPackageImpl setGwpAsanMode(int value) { public ParsingPackageImpl setGwpAsanMode(@ApplicationInfo.GwpAsanMode int value) {
gwpAsanMode = value; gwpAsanMode = value;
return this; return this;
} }
@Override @Override
public ParsingPackageImpl setMemtagMode(int value) { public ParsingPackageImpl setMemtagMode(@ApplicationInfo.MemtagMode int value) {
memtagMode = value; memtagMode = value;
return this; return this;
} }
@Override @Override
public ParsingPackageImpl setNativeHeapZeroInit(@Nullable Boolean value) { public ParsingPackageImpl setNativeHeapZeroInitialized(
nativeHeapZeroInit = value; @ApplicationInfo.NativeHeapZeroInitialized int value) {
nativeHeapZeroInitialized = value;
return this; return this;
} }

View File

@@ -854,20 +854,22 @@ public interface ParsingPackageRead extends Parcelable {
* @see ApplicationInfo#gwpAsanMode * @see ApplicationInfo#gwpAsanMode
* @see R.styleable#AndroidManifest_gwpAsanMode * @see R.styleable#AndroidManifest_gwpAsanMode
*/ */
public int getGwpAsanMode(); @ApplicationInfo.GwpAsanMode
int getGwpAsanMode();
/** /**
* @see ApplicationInfo#memtagMode * @see ApplicationInfo#memtagMode
* @see R.styleable#AndroidManifest_memtagMode * @see R.styleable#AndroidManifest_memtagMode
*/ */
@ApplicationInfo.MemtagMode
int getMemtagMode(); int getMemtagMode();
/** /**
* @see ApplicationInfo#nativeHeapZeroInit * @see ApplicationInfo#nativeHeapZeroInitialized
* @see R.styleable#AndroidManifest_nativeHeapZeroInit * @see R.styleable#AndroidManifest_nativeHeapZeroInitialized
*/ */
@Nullable @ApplicationInfo.NativeHeapZeroInitialized
Boolean isNativeHeapZeroInit(); int getNativeHeapZeroInitialized();
// TODO(b/135203078): Hide and enforce going through PackageInfoUtils // TODO(b/135203078): Hide and enforce going through PackageInfoUtils
ApplicationInfo toAppInfoWithoutState(); ApplicationInfo toAppInfoWithoutState();

View File

@@ -1800,9 +1800,11 @@ public class ParsingPackageUtils {
pkg.setGwpAsanMode(sa.getInt(R.styleable.AndroidManifestApplication_gwpAsanMode, -1)); pkg.setGwpAsanMode(sa.getInt(R.styleable.AndroidManifestApplication_gwpAsanMode, -1));
pkg.setMemtagMode(sa.getInt(R.styleable.AndroidManifestApplication_memtagMode, -1)); pkg.setMemtagMode(sa.getInt(R.styleable.AndroidManifestApplication_memtagMode, -1));
if (sa.hasValue(R.styleable.AndroidManifestApplication_nativeHeapZeroInit)) { if (sa.hasValue(R.styleable.AndroidManifestApplication_nativeHeapZeroInitialized)) {
pkg.setNativeHeapZeroInit(sa.getBoolean( Boolean v = sa.getBoolean(
R.styleable.AndroidManifestApplication_nativeHeapZeroInit, false)); R.styleable.AndroidManifestApplication_nativeHeapZeroInitialized, false);
pkg.setNativeHeapZeroInitialized(
v ? ApplicationInfo.ZEROINIT_ENABLED : ApplicationInfo.ZEROINIT_DISABLED);
} }
} finally { } finally {
sa.recycle(); sa.recycle();

View File

@@ -42,10 +42,12 @@ public class ParsedProcess implements Parcelable {
@DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class) @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class)
protected Set<String> deniedPermissions = emptySet(); protected Set<String> deniedPermissions = emptySet();
@ApplicationInfo.GwpAsanMode
protected int gwpAsanMode = ApplicationInfo.GWP_ASAN_DEFAULT; protected int gwpAsanMode = ApplicationInfo.GWP_ASAN_DEFAULT;
@ApplicationInfo.MemtagMode
protected int memtagMode = ApplicationInfo.MEMTAG_DEFAULT; protected int memtagMode = ApplicationInfo.MEMTAG_DEFAULT;
@Nullable @ApplicationInfo.NativeHeapZeroInitialized
protected Boolean nativeHeapZeroInit = null; protected int nativeHeapZeroInitialized = ApplicationInfo.ZEROINIT_DEFAULT;
public ParsedProcess() { public ParsedProcess() {
} }
@@ -78,9 +80,9 @@ public class ParsedProcess implements Parcelable {
public ParsedProcess( public ParsedProcess(
@NonNull String name, @NonNull String name,
@NonNull Set<String> deniedPermissions, @NonNull Set<String> deniedPermissions,
int gwpAsanMode, @ApplicationInfo.GwpAsanMode int gwpAsanMode,
int memtagMode, @ApplicationInfo.MemtagMode int memtagMode,
@Nullable Boolean nativeHeapZeroInit) { @ApplicationInfo.NativeHeapZeroInitialized int nativeHeapZeroInitialized) {
this.name = name; this.name = name;
com.android.internal.util.AnnotationValidations.validate( com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, name); NonNull.class, null, name);
@@ -88,8 +90,14 @@ public class ParsedProcess implements Parcelable {
com.android.internal.util.AnnotationValidations.validate( com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, deniedPermissions); NonNull.class, null, deniedPermissions);
this.gwpAsanMode = gwpAsanMode; this.gwpAsanMode = gwpAsanMode;
com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.GwpAsanMode.class, null, gwpAsanMode);
this.memtagMode = memtagMode; this.memtagMode = memtagMode;
this.nativeHeapZeroInit = nativeHeapZeroInit; com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.MemtagMode.class, null, memtagMode);
this.nativeHeapZeroInitialized = nativeHeapZeroInitialized;
com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.NativeHeapZeroInitialized.class, null, nativeHeapZeroInitialized);
// onConstructed(); // You can define this method to get a callback // onConstructed(); // You can define this method to get a callback
} }
@@ -105,18 +113,18 @@ public class ParsedProcess implements Parcelable {
} }
@DataClass.Generated.Member @DataClass.Generated.Member
public int getGwpAsanMode() { public @ApplicationInfo.GwpAsanMode int getGwpAsanMode() {
return gwpAsanMode; return gwpAsanMode;
} }
@DataClass.Generated.Member @DataClass.Generated.Member
public int getMemtagMode() { public @ApplicationInfo.MemtagMode int getMemtagMode() {
return memtagMode; return memtagMode;
} }
@DataClass.Generated.Member @DataClass.Generated.Member
public @Nullable Boolean getNativeHeapZeroInit() { public @ApplicationInfo.NativeHeapZeroInitialized int getNativeHeapZeroInitialized() {
return nativeHeapZeroInit; return nativeHeapZeroInitialized;
} }
@DataClass.Generated.Member @DataClass.Generated.Member
@@ -136,14 +144,11 @@ public class ParsedProcess implements Parcelable {
// You can override field parcelling by defining methods like: // You can override field parcelling by defining methods like:
// void parcelFieldName(Parcel dest, int flags) { ... } // void parcelFieldName(Parcel dest, int flags) { ... }
byte flg = 0;
if (nativeHeapZeroInit != null) flg |= 0x10;
dest.writeByte(flg);
dest.writeString(name); dest.writeString(name);
sParcellingForDeniedPermissions.parcel(deniedPermissions, dest, flags); sParcellingForDeniedPermissions.parcel(deniedPermissions, dest, flags);
dest.writeInt(gwpAsanMode); dest.writeInt(gwpAsanMode);
dest.writeInt(memtagMode); dest.writeInt(memtagMode);
if (nativeHeapZeroInit != null) dest.writeBoolean(nativeHeapZeroInit); dest.writeInt(nativeHeapZeroInitialized);
} }
@Override @Override
@@ -157,12 +162,11 @@ public class ParsedProcess implements Parcelable {
// You can override field unparcelling by defining methods like: // You can override field unparcelling by defining methods like:
// static FieldType unparcelFieldName(Parcel in) { ... } // static FieldType unparcelFieldName(Parcel in) { ... }
byte flg = in.readByte();
String _name = in.readString(); String _name = in.readString();
Set<String> _deniedPermissions = sParcellingForDeniedPermissions.unparcel(in); Set<String> _deniedPermissions = sParcellingForDeniedPermissions.unparcel(in);
int _gwpAsanMode = in.readInt(); int _gwpAsanMode = in.readInt();
int _memtagMode = in.readInt(); int _memtagMode = in.readInt();
Boolean _nativeHeapZeroInit = (flg & 0x10) == 0 ? null : (Boolean) in.readBoolean(); int _nativeHeapZeroInitialized = in.readInt();
this.name = _name; this.name = _name;
com.android.internal.util.AnnotationValidations.validate( com.android.internal.util.AnnotationValidations.validate(
@@ -171,8 +175,14 @@ public class ParsedProcess implements Parcelable {
com.android.internal.util.AnnotationValidations.validate( com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, deniedPermissions); NonNull.class, null, deniedPermissions);
this.gwpAsanMode = _gwpAsanMode; this.gwpAsanMode = _gwpAsanMode;
com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.GwpAsanMode.class, null, gwpAsanMode);
this.memtagMode = _memtagMode; this.memtagMode = _memtagMode;
this.nativeHeapZeroInit = _nativeHeapZeroInit; com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.MemtagMode.class, null, memtagMode);
this.nativeHeapZeroInitialized = _nativeHeapZeroInitialized;
com.android.internal.util.AnnotationValidations.validate(
ApplicationInfo.NativeHeapZeroInitialized.class, null, nativeHeapZeroInitialized);
// onConstructed(); // You can define this method to get a callback // onConstructed(); // You can define this method to get a callback
} }
@@ -192,10 +202,10 @@ public class ParsedProcess implements Parcelable {
}; };
@DataClass.Generated( @DataClass.Generated(
time = 1611615591258L, time = 1615850515058L,
codegenVersion = "1.0.22", codegenVersion = "1.0.22",
sourceFile = "frameworks/base/core/java/android/content/pm/parsing/component/ParsedProcess.java", sourceFile = "frameworks/base/core/java/android/content/pm/parsing/component/ParsedProcess.java",
inputSignatures = "protected @android.annotation.NonNull java.lang.String name\nprotected @android.annotation.NonNull @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedStringSet.class) java.util.Set<java.lang.String> deniedPermissions\nprotected int gwpAsanMode\nprotected int memtagMode\nprotected @android.annotation.Nullable java.lang.Boolean nativeHeapZeroInit\npublic void addStateFrom(android.content.pm.parsing.component.ParsedProcess)\nclass ParsedProcess extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genGetters=true, genSetters=false, genParcelable=true, genAidl=false, genBuilder=false)") inputSignatures = "protected @android.annotation.NonNull java.lang.String name\nprotected @android.annotation.NonNull @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedStringSet.class) java.util.Set<java.lang.String> deniedPermissions\nprotected @android.content.pm.ApplicationInfo.GwpAsanMode int gwpAsanMode\nprotected @android.content.pm.ApplicationInfo.MemtagMode int memtagMode\nprotected @android.content.pm.ApplicationInfo.NativeHeapZeroInitialized int nativeHeapZeroInitialized\npublic void addStateFrom(android.content.pm.parsing.component.ParsedProcess)\nclass ParsedProcess extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genGetters=true, genSetters=false, genParcelable=true, genAidl=false, genBuilder=false)")
@Deprecated @Deprecated
private void __metadata() {} private void __metadata() {}

View File

@@ -17,6 +17,7 @@
package android.content.pm.parsing.component; package android.content.pm.parsing.component;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.content.pm.ApplicationInfo;
import android.content.pm.parsing.ParsingPackage; import android.content.pm.parsing.ParsingPackage;
import android.content.pm.parsing.ParsingUtils; import android.content.pm.parsing.ParsingUtils;
import android.content.pm.parsing.result.ParseInput; import android.content.pm.parsing.result.ParseInput;
@@ -106,9 +107,11 @@ public class ParsedProcessUtils {
proc.gwpAsanMode = sa.getInt(R.styleable.AndroidManifestProcess_gwpAsanMode, -1); proc.gwpAsanMode = sa.getInt(R.styleable.AndroidManifestProcess_gwpAsanMode, -1);
proc.memtagMode = sa.getInt(R.styleable.AndroidManifestProcess_memtagMode, -1); proc.memtagMode = sa.getInt(R.styleable.AndroidManifestProcess_memtagMode, -1);
if (sa.hasValue(R.styleable.AndroidManifestProcess_nativeHeapZeroInit)) { if (sa.hasValue(R.styleable.AndroidManifestProcess_nativeHeapZeroInitialized)) {
proc.nativeHeapZeroInit = Boolean v = sa.getBoolean(
sa.getBoolean(R.styleable.AndroidManifestProcess_nativeHeapZeroInit, false); R.styleable.AndroidManifestProcess_nativeHeapZeroInitialized, false);
proc.nativeHeapZeroInitialized =
v ? ApplicationInfo.ZEROINIT_ENABLED : ApplicationInfo.ZEROINIT_DISABLED;
} }
} finally { } finally {
sa.recycle(); sa.recycle();

View File

@@ -1560,6 +1560,20 @@
<enum name="always" value="1" /> <enum name="always" value="1" />
</attr> </attr>
<!-- Enable hardware memory tagging (ARM MTE) in this process.
When enabled, heap memory bugs like use-after-free and buffer overlow
are detected and result in an immediate ("sync" mode) or delayed ("async"
mode) crash instead of a silent memory corruption. Sync mode, while slower,
provides enhanced bug reports including stack traces at the time of allocation
and deallocation of memory, similar to AddressSanitizer.
See the <a href="https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/enhancing-memory-safety">ARM announcement</a>
for more details.
<p>This attribute can be applied to a
{@link android.R.styleable#AndroidManifestProcess process} tag, or to an
{@link android.R.styleable#AndroidManifestApplication application} tag (to supply
a default setting for all application components). -->
<attr name="memtagMode"> <attr name="memtagMode">
<enum name="default" value="-1" /> <enum name="default" value="-1" />
<enum name="off" value="0" /> <enum name="off" value="0" />
@@ -1836,7 +1850,9 @@
<attr name="memtagMode" /> <attr name="memtagMode" />
<attr name="nativeHeapZeroInit" format="boolean" /> <!-- If {@code true} enables automatic zero initialization of all native heap
allocations. -->
<attr name="nativeHeapZeroInitialized" format="boolean" />
<!-- @hide no longer used, kept to preserve padding --> <!-- @hide no longer used, kept to preserve padding -->
<attr name="allowAutoRevokePermissionsExemption" format="boolean" /> <attr name="allowAutoRevokePermissionsExemption" format="boolean" />
@@ -2362,7 +2378,7 @@
<attr name="process" /> <attr name="process" />
<attr name="gwpAsanMode" /> <attr name="gwpAsanMode" />
<attr name="memtagMode" /> <attr name="memtagMode" />
<attr name="nativeHeapZeroInit" /> <attr name="nativeHeapZeroInitialized" />
</declare-styleable> </declare-styleable>
<!-- The <code>deny-permission</code> tag specifies that a permission is to be denied <!-- The <code>deny-permission</code> tag specifies that a permission is to be denied

View File

@@ -3047,7 +3047,7 @@
<!-- attribute definitions go here --> <!-- attribute definitions go here -->
<public name="requireDeviceScreenOn" /> <public name="requireDeviceScreenOn" />
<public name="memtagMode" /> <public name="memtagMode" />
<public name="nativeHeapZeroInit" /> <public name="nativeHeapZeroInitialized" />
</public-group> </public-group>
<public-group type="drawable" first-id="0x010800b5"> <public-group type="drawable" first-id="0x010800b5">

View File

@@ -1722,12 +1722,13 @@ public final class ProcessList {
private boolean enableNativeHeapZeroInit(ProcessRecord app) { private boolean enableNativeHeapZeroInit(ProcessRecord app) {
// Look at the process attribute first. // Look at the process attribute first.
if (app.processInfo != null && app.processInfo.nativeHeapZeroInit != null) { if (app.processInfo != null
return app.processInfo.nativeHeapZeroInit; && app.processInfo.nativeHeapZeroInitialized != ApplicationInfo.ZEROINIT_DEFAULT) {
return app.processInfo.nativeHeapZeroInitialized == ApplicationInfo.ZEROINIT_ENABLED;
} }
// Then at the application attribute. // Then at the application attribute.
if (app.info.isNativeHeapZeroInit() != null) { if (app.info.getNativeHeapZeroInitialized() != ApplicationInfo.ZEROINIT_DEFAULT) {
return app.info.isNativeHeapZeroInit(); return app.info.getNativeHeapZeroInitialized() == ApplicationInfo.ZEROINIT_ENABLED;
} }
// Compat feature last. // Compat feature last.
if (mPlatformCompat.isChangeEnabled(NATIVE_HEAP_ZERO_INIT, app.info)) { if (mPlatformCompat.isChangeEnabled(NATIVE_HEAP_ZERO_INIT, app.info)) {

View File

@@ -650,7 +650,7 @@ class ProcessRecord implements WindowProcessListener {
if (procInfo != null && procInfo.deniedPermissions == null if (procInfo != null && procInfo.deniedPermissions == null
&& procInfo.gwpAsanMode == ApplicationInfo.GWP_ASAN_DEFAULT && procInfo.gwpAsanMode == ApplicationInfo.GWP_ASAN_DEFAULT
&& procInfo.memtagMode == ApplicationInfo.MEMTAG_DEFAULT && procInfo.memtagMode == ApplicationInfo.MEMTAG_DEFAULT
&& procInfo.nativeHeapZeroInit == null) { && procInfo.nativeHeapZeroInitialized == ApplicationInfo.ZEROINIT_DEFAULT) {
// If this process hasn't asked for permissions to be denied, or for a // If this process hasn't asked for permissions to be denied, or for a
// non-default GwpAsan mode, or any other non-default setting, then we don't // non-default GwpAsan mode, or any other non-default setting, then we don't
// care about it. // care about it.

View File

@@ -400,7 +400,7 @@ public class PackageInfoUtils {
retProcs.put(proc.getName(), retProcs.put(proc.getName(),
new ProcessInfo(proc.getName(), new ArraySet<>(proc.getDeniedPermissions()), new ProcessInfo(proc.getName(), new ArraySet<>(proc.getDeniedPermissions()),
proc.getGwpAsanMode(), proc.getMemtagMode(), proc.getGwpAsanMode(), proc.getMemtagMode(),
proc.getNativeHeapZeroInit())); proc.getNativeHeapZeroInitialized()));
} }
return retProcs; return retProcs;
} }