X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/cb3231590a3c94ab4375e2228bd5e86b0cf1ad7e..ea3f04195ba4a5034c9c8e9b726d4f7ce96f1832:/libsyscall/wrappers/terminate_with_reason.c diff --git a/libsyscall/wrappers/terminate_with_reason.c b/libsyscall/wrappers/terminate_with_reason.c index dd7719b47..9b46ed940 100644 --- a/libsyscall/wrappers/terminate_with_reason.c +++ b/libsyscall/wrappers/terminate_with_reason.c @@ -24,8 +24,38 @@ #include #include #include +#include #include +/* 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,