Loading...
--- libmalloc/libmalloc-792.1.1/src/malloc.c
+++ libmalloc/libmalloc-715.100.22/src/malloc.c
@@ -76,8 +76,13 @@
 	MALLOC_XZONE_OVERRIDE_ENABLED,
 } malloc_xzone_override_t;
 
+static malloc_xzone_override_t malloc_xzone_enabled_override;
 static malloc_xzone_override_t malloc_xzone_nano_override;
 static malloc_xzone_override_t malloc_nano_on_xzone_override;
+
+#if CONFIG_CHECK_PLATFORM_BINARY
+static bool malloc_xzone_allow_non_platform;
+#endif // CONFIG_CHECK_PLATFORM_BINARY
 
 unsigned malloc_debug_flags = 0;
 bool malloc_tracing_enabled = false;
@@ -123,14 +128,8 @@
 static void malloc_sanitizer_fallback_deallocate_poison(uintptr_t ptr, size_t sz);
 #endif
 /* These masks are exported for libdispatch to register with (see "internal.h") */
-unsigned long malloc_memorypressure_mask_default_4libdispatch = MALLOC_MEMORYPRESSURE_MASK_DEFAULT;
-unsigned long malloc_memorypressure_mask_msl_4libdispatch = MALLOC_MEMORYPRESSURE_MASK_MSL;
-
-#if MALLOC_TARGET_IOS || TARGET_OS_SIMULATOR
-static unsigned long malloc_memorystatus_mask_resource_exception_handling = 0;
-#else
-static unsigned long malloc_memorystatus_mask_resource_exception_handling = MALLOC_MEMORYSTATUS_MASK_RESOURCE_EXCEPTION_HANDLING;
-#endif
+const unsigned long malloc_memorypressure_mask_default_4libdispatch = MALLOC_MEMORYPRESSURE_MASK_DEFAULT;
+const unsigned long malloc_memorypressure_mask_msl_4libdispatch = MALLOC_MEMORYPRESSURE_MASK_MSL;
 
 MALLOC_NOEXPORT malloc_zone_t* lite_zone = NULL;
 
@@ -479,15 +478,11 @@
 		{ "ExternalQuickLookSatellite-x86_64",   MALLOC_PROCESS_QUICKLOOK_MACOS },
 #endif // TARGET_OS_OSX
 
-		{ "MobileSafari",                                          MALLOC_PROCESS_BROWSER, },
-		{ "com.apple.WebKit.Networking",                           MALLOC_PROCESS_BROWSER, },
-		{ "com.apple.WebKit.Networking.Development",               MALLOC_PROCESS_BROWSER, },
-		{ "com.apple.WebKit.GPU",                                  MALLOC_PROCESS_BROWSER, },
-		{ "com.apple.WebKit.GPU.Development",                      MALLOC_PROCESS_BROWSER, },
-		{ "com.apple.WebKit.WebContent",                           MALLOC_PROCESS_BROWSER, },
-		{ "com.apple.WebKit.WebContent.Development",               MALLOC_PROCESS_BROWSER, },
-		{ "com.apple.WebKit.WebContent.CaptivePortal",             MALLOC_PROCESS_BROWSER, },
-		{ "com.apple.WebKit.WebContent.CaptivePortal.Development", MALLOC_PROCESS_BROWSER, },
+		{ "MobileSafari",                MALLOC_PROCESS_BROWSER, },
+		{ "com.apple.WebKit.Networking", MALLOC_PROCESS_BROWSER, },
+		{ "com.apple.WebKit.GPU",        MALLOC_PROCESS_BROWSER, },
+		{ "com.apple.WebKit.WebContent", MALLOC_PROCESS_BROWSER, },
+		{ "com.apple.WebKit.WebContent.CaptivePortal", MALLOC_PROCESS_BROWSER, },
 		{ "MTLCompilerService",          MALLOC_PROCESS_MTLCOMPILERSERVICE },
 
 #if TARGET_OS_OSX
@@ -530,24 +525,13 @@
 		{ "AegirPoster",         MALLOC_PROCESS_AEGIRPOSTER, },
 		{ "CollectionsPoster",   MALLOC_PROCESS_COLLECTIONSPOSTER, },
 
-#if TARGET_OS_WATCH
-		{ "backboardd",          MALLOC_PROCESS_BACKBOARDD, },
-		{ "ClockFace",           MALLOC_PROCESS_CLOCKFACE, },
-#endif // TARGET_OS_WATCH
-
 #if TARGET_OS_OSX
 		{ "GroupSessionService", MALLOC_PROCESS_GROUPSESSIONSERVICE, },
 		{ "IMTranscoderAgent", MALLOC_PROCESS_IMTRANSCODERAGENT, },
 		{ "Messages", MALLOC_PROCESS_MESSAGES, },
 		{ "Screen Sharing", MALLOC_PROCESS_SCREENSHARING, },
 		{ "keychainsharingmessagingd", MALLOC_PROCESS_KEYCHAINSHARINGMESSAGINGD, },
-
-		{ "VTEncoderXPCService", MALLOC_PROCESS_VTENCODERXPCSERVICE, },
 #endif // TARGET_OS_OSX
-
-		{ "ReportCrash", MALLOC_PROCESS_REPORTCRASH, },
-		{ "AudioConverterService", MALLOC_PROCESS_AUDIOCONVERTERSERVICE, },
-
 	};
 
 	if (getpid() == 1) {
@@ -582,12 +566,8 @@
 	for (size_t i = 0; i < countof(name_identity_mapping); i++) {
 		if (!strcmp(name, name_identity_mapping[i].name)) {
 			malloc_process_identity = name_identity_mapping[i].identity;
-			return;
-		}
-	}
-
-	if (os_security_config_get() & OS_SECURITY_CONFIG_HARDENED_HEAP) {
-		malloc_process_identity = MALLOC_PROCESS_HARDENED_HEAP_CONFIG;
+			break;
+		}
 	}
 }
 
@@ -671,19 +651,14 @@
 	ENABLEMENT_CASE(MANAGEDASSETSD, true);
 	ENABLEMENT_CASE(POLARISD, true);
 
-	ENABLEMENT_CASE_FF(ARKITD, arkitd, true, true);
-	ENABLEMENT_CASE_FF(BACKBOARDD, backboardd, true, true);
-	ENABLEMENT_CASE_FF(WAKEBOARDD, wakeboardd, true, true);
-	ENABLEMENT_CASE_FF(REALITYCAMERAD, realitycamerad, true, true);
+	ENABLEMENT_CASE_FF(ARKITD, arkitd, false, false);
+	ENABLEMENT_CASE_FF(BACKBOARDD, backboardd, false, false);
+	ENABLEMENT_CASE_FF(WAKEBOARDD, wakeboardd, false, false);
+	ENABLEMENT_CASE_FF(REALITYCAMERAD, realitycamerad, false, false);
 #endif
 
 	ENABLEMENT_CASE_FF(AEGIRPOSTER, aegirposter, false, false);
 	ENABLEMENT_CASE_FF(COLLECTIONSPOSTER, CollectionsPoster, false, false);
-
-#if TARGET_OS_WATCH
-	ENABLEMENT_CASE_FF(BACKBOARDD, backboardd, false, false);
-	ENABLEMENT_CASE_FF(CLOCKFACE, ClockFace, false, false);
-#endif
 
 #if TARGET_OS_OSX
 	ENABLEMENT_CASE(GROUPSESSIONSERVICE, true);
@@ -696,16 +671,6 @@
 #if TARGET_OS_OSX
 	ENABLEMENT_CASE(VTDECODERXPCSERVICE, true);
 #endif
-
-#if TARGET_OS_OSX
-	ENABLEMENT_CASE_FF(VTENCODERXPCSERVICE, VTEncoderXPCService, false, false);
-#endif
-
-	ENABLEMENT_CASE(REPORTCRASH, true);
-	ENABLEMENT_CASE(AUDIOCONVERTERSERVICE, true);
-
-
-	ENABLEMENT_CASE(HARDENED_HEAP_CONFIG, true);
 
 	default:
 		return false;
@@ -734,14 +699,13 @@
 	} else
 #endif // CONFIG_MALLOC_PROCESS_IDENTITY
 	{
-#if MALLOC_TARGET_IOS_ONLY || TARGET_OS_VISION || TARGET_OS_OSX || \
-		TARGET_OS_WATCH
+#if MALLOC_TARGET_IOS_ONLY || TARGET_OS_VISION
 		secure_allocator = malloc_secure_feature_enabled(
 				SecureAllocator_SystemWide, true, true);
 #else
 		secure_allocator = malloc_secure_feature_enabled(
 				SecureAllocator_SystemWide, false, false);
-#endif	// MALLOC_TARGET_IOS_ONLY || TARGET_OS_VISION || TARGET_OS_OSX
+#endif	// MALLOC_TARGET_IOS_ONLY || TARGET_OS_VISION
 	}
 
 #if TARGET_OS_OSX && !TARGET_CPU_ARM64
@@ -749,6 +713,14 @@
 		secure_allocator = false;
 	}
 #endif // TARGET_OS_OSX && !TARGET_CPU_ARM64
+
+#if TARGET_OS_OSX
+	bool allow_non_platform = os_feature_enabled_simple(libmalloc,
+			SecureAllocator_NonPlatform, false);
+	if (malloc_xzone_allow_non_platform != allow_non_platform) {
+		malloc_xzone_allow_non_platform = allow_non_platform;
+	}
+#endif // TARGET_OS_OSX
 
 	if (secure_allocator != malloc_xzone_enabled) {
 		malloc_xzone_enabled = secure_allocator;
@@ -1312,12 +1284,12 @@
 		size_t malloc_zones_size = malloc_num_zones * sizeof(malloc_zone_t *);
 		mach_vm_size_t alloc_size = round_page(malloc_zones_size + vm_page_size);
 		mach_vm_address_t vm_addr;
-
-		vm_addr = (mach_vm_address_t)mvm_allocate_plat(0, (size_t)alloc_size, 0,
-					VM_FLAGS_ANYWHERE, MALLOC_GUARDED_METADATA,
-					VM_MEMORY_MALLOC, NULL);
-		if (vm_addr == 0) {
-			malloc_report(ASL_LEVEL_ERR, "malloc_zone_register allocation failed\n");
+		int alloc_flags = VM_FLAGS_ANYWHERE | VM_MAKE_TAG(VM_MEMORY_MALLOC);
+
+		vm_addr = vm_page_size;
+		kern_return_t kr = mach_vm_allocate(mach_task_self(), &vm_addr, alloc_size, alloc_flags);
+		if (kr) {
+			malloc_report(ASL_LEVEL_ERR, "malloc_zone_register allocation failed: %d\n", kr);
 			return;
 		}
 
@@ -1449,10 +1421,6 @@
 
 
 	set_flags_from_environment();
-	
-	// Add-in mask bits that can be set via env var MallocEnableMSLAtLimitWarning, for libdispatch to setup the desired handlers
-	malloc_memorypressure_mask_default_4libdispatch |= malloc_memorystatus_mask_resource_exception_handling;
-	malloc_memorypressure_mask_msl_4libdispatch |= malloc_memorystatus_mask_resource_exception_handling;
 
 	if (malloc_report_config) {
 		malloc_report(ASL_LEVEL_INFO, "Internal Security Policy: %d\n",
@@ -1533,7 +1501,8 @@
 #if CONFIG_MAGAZINE_DEFERRED_RECLAIM
 	mach_vm_reclaim_error_t vmdr_kr = VM_RECLAIM_SUCCESS;
 	if (large_cache_enabled) {
-		const bool xzone_deferred_reclaim = initial_xzone_zone;
+		const bool xzone_deferred_reclaim =
+				CONFIG_XZM_DEFERRED_RECLAIM && initial_xzone_zone;
 		if (xzone_deferred_reclaim) {
 			// xzone_malloc will own the deferred_reclaim buffer
 			large_cache_enabled = false;
@@ -1698,14 +1667,11 @@
 
 #if TARGET_OS_OSX
 	// rdar://99288027
-	if (dyld_get_active_platform() == PLATFORM_MACOS &&
-			!dyld_program_sdk_at_least(dyld_platform_version_macOS_13_0)) {
+	if (!dyld_program_sdk_at_least(dyld_platform_version_macOS_13_0)) {
 		if (malloc_zero_policy == MALLOC_ZERO_ON_FREE) {
 			malloc_zero_policy = MALLOC_ZERO_ON_ALLOC;
-			malloc_xzone_enabled = false;
-		}
-	}
-
+		}
+	}
 #else // TARGET_OS_OSX
 #endif // TARGET_OS_OSX
 
@@ -2056,6 +2022,9 @@
 		long value = malloc_common_convert_to_long(flag, &endp);
 		if (!*endp && endp != flag && (value == 0 || value == 1)) {
 			malloc_xzone_enabled = value;
+			malloc_xzone_enabled_override = value ?
+					MALLOC_XZONE_OVERRIDE_ENABLED :
+					MALLOC_XZONE_OVERRIDE_DISABLED;
 		} else {
 			malloc_report(ASL_LEVEL_ERR, "MallocSecureAllocator must be 0 or 1.\n");
 		}
@@ -2643,7 +2612,7 @@
 	}
 	// excludes 0 == alignment
 	// relies on sizeof(void *) being a power of two.
-	if (alignment < MALLOC_ZONE_MALLOC_DEFAULT_ALIGN ||
+	if (alignment < sizeof(void *) ||
 			0 != (alignment & (alignment - 1))) {
 		err = EINVAL;
 		goto out;
@@ -3064,7 +3033,7 @@
 		// test made in malloc_zone_memalign to vet each request. Only if that test fails
 		// and returns NULL, do we arrive here to detect the bogus alignment and give the
 		// required EINVAL return.
-		if (alignment < MALLOC_ZONE_MALLOC_DEFAULT_ALIGN || // excludes 0 == alignment
+		if (alignment < sizeof(void *) ||			  // excludes 0 == alignment
 				0 != (alignment & (alignment - 1))) { // relies on sizeof(void *) being a power of two.
 			return EINVAL;
 		}
@@ -3144,8 +3113,8 @@
 }
 
 void *
-_malloc_zone_malloc_with_options_outlined(malloc_zone_t *zone, size_t align,
-		size_t size, malloc_zone_malloc_options_t options)
+_malloc_zone_malloc_with_options_np_outlined(malloc_zone_t *zone, size_t align,
+		size_t size, malloc_options_np_t options)
 {
 	void *ptr = NULL;
 
@@ -3170,8 +3139,7 @@
 		// There's no reasonable way to have the fallback callsite type
 		// descriptor work here.  That's okay, as it's uncommon and SPI, so its
 		// callers should be built with TMO.
-		const malloc_zone_malloc_options_t known_options =
-				MALLOC_ZONE_MALLOC_OPTION_CLEAR
+		const malloc_options_np_t known_options = MALLOC_NP_OPTION_CLEAR
 				;
 		if (options & ~known_options) {
 			malloc_zone_error(MALLOC_ABORT_ON_ERROR, true,
@@ -3181,12 +3149,12 @@
 		}
 
 
-		if (align > MALLOC_ZONE_MALLOC_DEFAULT_ALIGN) {
+		if (align) {
 			ptr = malloc_zone_memalign(zone, align, size);
-			if (ptr && (options & MALLOC_ZONE_MALLOC_OPTION_CLEAR)) {
+			if (ptr && (options & MALLOC_NP_OPTION_CLEAR)) {
 				memset(ptr, 0, size);
 			}
-		} else if (options & MALLOC_ZONE_MALLOC_OPTION_CLEAR) {
+		} else if (options & MALLOC_NP_OPTION_CLEAR) {
 			ptr = malloc_zone_calloc(zone, 1, size);
 		} else {
 			ptr = malloc_zone_malloc(zone, size);
@@ -3199,7 +3167,7 @@
 
 		if (os_unlikely(malloc_logger)) {
 			uint32_t flags = MALLOC_LOG_TYPE_ALLOCATE | MALLOC_LOG_TYPE_HAS_ZONE;
-			if (options & MALLOC_ZONE_MALLOC_OPTION_CLEAR) {
+			if (options & MALLOC_NP_OPTION_CLEAR) {
 				flags |= MALLOC_LOG_TYPE_CLEARED;
 			}
 			malloc_logger(flags, (uintptr_t)zone, (uintptr_t)size,
@@ -3224,8 +3192,8 @@
 }
 
 void *
-malloc_zone_malloc_with_options(malloc_zone_t *zone, size_t align,
-		size_t size, malloc_zone_malloc_options_t options)
+malloc_zone_malloc_with_options_np(malloc_zone_t *zone, size_t align,
+		size_t size, malloc_options_np_t options)
 {
 	if (os_unlikely((align != 0) && (!powerof2(align) ||
 			((size & (align-1)) != 0)))) { // equivalent to (size % align != 0)
@@ -3233,7 +3201,7 @@
 	}
 
 	if (os_unlikely(malloc_logger || malloc_slowpath)) {
-		return _malloc_zone_malloc_with_options_outlined(zone, align, size,
+		return _malloc_zone_malloc_with_options_np_outlined(zone, align, size,
 				options);
 	}
 
@@ -3246,15 +3214,8 @@
 				options, malloc_callsite_fallback_type_id());
 	}
 
-	return _malloc_zone_malloc_with_options_outlined(zone, align, size,
+	return _malloc_zone_malloc_with_options_np_outlined(zone, align, size,
 			options);
-}
-
-void * __sized_by_or_null(size)
-malloc_zone_malloc_with_options_np(malloc_zone_t *zone, size_t align,
-		size_t size, malloc_options_np_t options)
-{
-	return malloc_zone_malloc_with_options(zone, align, size, options);
 }
 
 /*********	Purgeable zone	************/
@@ -3378,9 +3339,11 @@
 		malloc_register_stack_logger();
 	}
 
-	if (event & malloc_memorystatus_mask_resource_exception_handling) {
+#if ENABLE_MEMORY_RESOURCE_EXCEPTION_HANDLING
+	if (event & MALLOC_MEMORYSTATUS_MASK_RESOURCE_EXCEPTION_HANDLING) {
 		malloc_register_stack_logger();
 	}
+#endif /* ENABLE_MEMORY_RESOURCE_EXCEPTION_HANDLING */
 
 	if (msl.handle_memory_event) {
 		// Let MSL see the event.