Loading...
src/dyld.cpp dyld-360.19 dyld-360.22
--- dyld/dyld-360.19/src/dyld.cpp
+++ dyld/dyld-360.22/src/dyld.cpp
@@ -4413,7 +4413,10 @@
 #if TARGET_IPHONE_SIMULATOR
 		dyld::log("dyld: warning: could not load inserted library '%s' because %s\n", path, msg);
 #else
-		halt(dyld::mkstringf("could not load inserted library '%s' because %s\n", path, msg));
+		if ( sProcessRequiresLibraryValidation )
+			dyld::log("dyld: warning: could not load inserted library '%s' into library validated process because %s\n", path, msg);
+		else
+			halt(dyld::mkstringf("could not load inserted library '%s' because %s\n", path, msg));
 #endif
 	}
 	catch (...) {
@@ -4546,7 +4549,18 @@
 								int argc, const char* argv[], const char* envp[], const char* apple[], uintptr_t* startGlue)
 {
 	*startGlue = 0;
-	
+
+	// <rdar://problem/25311921> simulator does not support restricted processes
+	uint32_t flags;
+	if ( csops(0, CS_OPS_STATUS, &flags, sizeof(flags)) == -1 )
+		return 0;
+	if ( (flags & CS_RESTRICT) == CS_RESTRICT )
+		return 0;
+	if ( issetugid() )
+		return 0;
+	if ( hasRestrictedSegment(mainExecutableMH) )
+		return 0;
+
 	// verify simulator dyld file is owned by root
 	struct stat sb;
 	if ( fstat(fd, &sb) == -1 )
@@ -4651,6 +4665,8 @@
 					//dyld::log("dyld_sim %s mapped at %p\n", seg->segname, segAddress);
 					if ( segAddress == (void*)(-1) )
 						return 0;
+					if ( ((uintptr_t)segAddress < loadAddress) || ((uintptr_t)segAddress+seg->filesize > loadAddress+mappingSize) )
+						return 0;
 				}
 				break;
 			case LC_CODE_SIGNATURE: