]> git.saurik.com Git - apple/xnu.git/blobdiff - libsyscall/wrappers/terminate_with_reason.c
xnu-7195.81.3.tar.gz
[apple/xnu.git] / libsyscall / wrappers / terminate_with_reason.c
index 52082bb687d602d59ee5c06770b32f91820adcbf..9b46ed9403abdb0c8528477b2f380e6aa377e212 100644 (file)
 #include <sys/types.h>
 #include <stdint.h>
 #include <signal.h>
+#include <os/reason_private.h>
 #include <unistd.h>
 
+/* Crash simulation */
+
+extern int pthread_current_stack_contains_np(const void *, unsigned long);
+int
+__darwin_check_fd_set_overflow(int n, const void *fd_set, int unlimited_select)
+{
+       if (n < 0) {
+               os_fault_with_payload(OS_REASON_LIBSYSTEM, OS_REASON_LIBSYSTEM_CODE_FAULT,
+                   &n, sizeof(n), "FD_SET underflow", 0);
+               return 0;
+       }
+
+       if (n >= __DARWIN_FD_SETSIZE) {
+               if (pthread_current_stack_contains_np((const void *) fd_set, sizeof(struct fd_set))) {
+                       if (!unlimited_select) {
+                               os_fault_with_payload(OS_REASON_LIBSYSTEM, OS_REASON_LIBSYSTEM_CODE_FAULT,
+                                   &n, sizeof(n), "FD_SET overflow", 0);
+                               return 0;
+                       } else {
+                               return 1;
+                       }
+               } else {
+                       return 1;
+               }
+       }
+
+       return 1;
+}
+
 /* System call entry points */
 int __terminate_with_payload(int pid, uint32_t reason_namespace, uint64_t reason_code,
     void *payload, uint32_t payload_size, const char *reason_string,
@@ -37,7 +67,7 @@ void __abort_with_payload(uint32_t reason_namespace, uint64_t reason_code,
 
 static void abort_with_payload_wrapper_internal(uint32_t reason_namespace, uint64_t reason_code,
     void *payload, uint32_t payload_size, const char *reason_string,
-    uint64_t reason_flags) __attribute__((noreturn));
+    uint64_t reason_flags) __attribute__((noreturn, cold));
 
 /* System call wrappers */
 int