Merge "Integrate isIsolatedComputeApp selection logics for secontexts" am: fc29fffbde am: 40de9fcf53

Original change: https://android-review.googlesource.com/c/platform/external/selinux/+/2391312

Change-Id: I2afc69f11d821db08eaf07ebb1d0ca9b4dadd3e8
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/libselinux/src/android/android_seapp.c b/libselinux/src/android/android_seapp.c
index 2b07001..dc3e9da 100644
--- a/libselinux/src/android/android_seapp.c
+++ b/libselinux/src/android/android_seapp.c
@@ -134,6 +134,7 @@
 	bool isPrivApp;
 	int32_t minTargetSdkVersion;
 	bool fromRunAs;
+	bool isIsolatedComputeApp;
 	/* outputs */
 	char *domain;
 	char *type;
@@ -239,7 +240,8 @@
 		(!s1->name.str || !strcmp(s1->name.str, s2->name.str)) &&
 		(s1->isPrivAppSet && s1->isPrivApp == s2->isPrivApp) &&
 		(s1->isSystemServer && s1->isSystemServer == s2->isSystemServer) &&
-		(s1->isEphemeralAppSet && s1->isEphemeralApp == s2->isEphemeralApp);
+		(s1->isEphemeralAppSet && s1->isEphemeralApp == s2->isEphemeralApp) &&
+		(s1->isIsolatedComputeApp && s1->isIsolatedComputeApp == s2->isIsolatedComputeApp);
 
 	if (dup) {
 		seapp_contexts_dup = true;
@@ -515,6 +517,15 @@
 						free_seapp_context(cur);
 						goto err;
 					}
+				} else if (!strcasecmp(name, "isIsolatedComputeApp")) {
+					if (!strcasecmp(value, "true"))
+						cur->isIsolatedComputeApp = true;
+					else if (!strcasecmp(value, "false"))
+						cur->isIsolatedComputeApp = false;
+					else {
+						free_seapp_context(cur);
+						goto err;
+					}
 				} else {
 					free_seapp_context(cur);
 					goto err;
@@ -552,7 +563,7 @@
 		int i;
 		for (i = 0; i < nspec; i++) {
 			cur = seapp_contexts[i];
-			selinux_log(SELINUX_INFO, "%s:  isSystemServer=%s  isEphemeralApp=%s user=%s seinfo=%s "
+			selinux_log(SELINUX_INFO, "%s:  isSystemServer=%s isEphemeralApp=%s isIsolatedComputeApp=%s user=%s seinfo=%s "
 					"name=%s isPrivApp=%s minTargetSdkVersion=%d fromRunAs=%s -> domain=%s type=%s level=%s levelFrom=%s",
 				__FUNCTION__,
 				cur->isSystemServer ? "true" : "false",
@@ -562,6 +573,7 @@
 				cur->isPrivAppSet ? (cur->isPrivApp ? "true" : "false") : "null",
 				cur->minTargetSdkVersion,
 				cur->fromRunAs ? "true" : "false",
+				cur->isIsolatedComputeApp ? "true" : "false",
 				cur->domain, cur->type, cur->level,
 				levelFromName[cur->levelFrom]);
 		}
@@ -615,6 +627,7 @@
 #define CAT_MAPPING_MAX_ID (0x1<<16)
 
 #define PRIVILEGED_APP_STR ":privapp"
+#define ISOLATED_COMPUTE_APP_STR ":isolatedComputeApp"
 #define EPHEMERAL_APP_STR ":ephemeralapp"
 #define TARGETSDKVERSION_STR ":targetSdkVersion="
 #define FROM_RUNAS_STR ":fromRunAs"
@@ -712,16 +725,17 @@
 	uid_t appid;
 	bool isPrivApp = false;
 	bool isEphemeralApp = false;
+	bool isIsolatedComputeApp = false;
 	int32_t targetSdkVersion = 0;
 	bool fromRunAs = false;
 	char parsedseinfo[BUFSIZ];
 
-
 	if (seinfo) {
 		if (seinfo_parse(parsedseinfo, seinfo, BUFSIZ))
 			goto err;
 		isPrivApp = strstr(seinfo, PRIVILEGED_APP_STR) ? true : false;
 		isEphemeralApp = strstr(seinfo, EPHEMERAL_APP_STR) ? true : false;
+		isIsolatedComputeApp = strstr(seinfo, ISOLATED_COMPUTE_APP_STR) ? true : false;
 		fromRunAs = strstr(seinfo, FROM_RUNAS_STR) ? true : false;
 		targetSdkVersion = get_app_targetSdkVersion(seinfo);
 		if (targetSdkVersion < 0) {
@@ -800,6 +814,9 @@
 		if (cur->fromRunAs != fromRunAs)
 			continue;
 
+		if (cur->isIsolatedComputeApp != isIsolatedComputeApp)
+			continue;
+
 		if (kind == SEAPP_TYPE && !cur->type)
 			continue;
 		else if (kind == SEAPP_DOMAIN && !cur->domain)