+ }
+ if (skip_wqthreads) {
+ skip_wqthreads = false;
+ goto again;
+ }
+ if (get_signalact(p->task, thr, 1) == KERN_SUCCESS) {
+ return KERN_SUCCESS;
+ }
+
+ return KERN_FAILURE;
+}
+
+static os_reason_t
+build_signal_reason(int signum, const char *procname)
+{
+ os_reason_t signal_reason = OS_REASON_NULL;
+ proc_t sender_proc = current_proc();
+ uint32_t reason_buffer_size_estimate = 0, proc_name_length = 0;
+ const char *default_sender_procname = "unknown";
+ mach_vm_address_t data_addr;
+ int ret;
+
+ signal_reason = os_reason_create(OS_REASON_SIGNAL, signum);
+ if (signal_reason == OS_REASON_NULL) {
+ printf("build_signal_reason: unable to allocate signal reason structure.\n");
+ return signal_reason;
+ }
+
+ reason_buffer_size_estimate = kcdata_estimate_required_buffer_size(2, sizeof(sender_proc->p_name) +
+ sizeof(sender_proc->p_pid));
+
+ ret = os_reason_alloc_buffer_noblock(signal_reason, reason_buffer_size_estimate);
+ if (ret != 0) {
+ printf("build_signal_reason: unable to allocate signal reason buffer.\n");
+ return signal_reason;
+ }
+
+ if (KERN_SUCCESS == kcdata_get_memory_addr(&signal_reason->osr_kcd_descriptor, KCDATA_TYPE_PID,
+ sizeof(sender_proc->p_pid), &data_addr)) {
+ kcdata_memcpy(&signal_reason->osr_kcd_descriptor, data_addr, &sender_proc->p_pid,
+ sizeof(sender_proc->p_pid));
+ } else {
+ printf("build_signal_reason: exceeded space in signal reason buf, unable to log PID\n");
+ }
+
+ proc_name_length = sizeof(sender_proc->p_name);
+ if (KERN_SUCCESS == kcdata_get_memory_addr(&signal_reason->osr_kcd_descriptor, KCDATA_TYPE_PROCNAME,
+ proc_name_length, &data_addr)) {
+ if (procname) {
+ char truncated_procname[proc_name_length];
+ strncpy((char *) &truncated_procname, procname, proc_name_length);
+ truncated_procname[proc_name_length - 1] = '\0';
+
+ kcdata_memcpy(&signal_reason->osr_kcd_descriptor, data_addr, truncated_procname,
+ (uint32_t)strlen((char *) &truncated_procname));
+ } else if (*sender_proc->p_name) {
+ kcdata_memcpy(&signal_reason->osr_kcd_descriptor, data_addr, &sender_proc->p_name,
+ sizeof(sender_proc->p_name));
+ } else {
+ kcdata_memcpy(&signal_reason->osr_kcd_descriptor, data_addr, &default_sender_procname,
+ (uint32_t)strlen(default_sender_procname) + 1);
+ }
+ } else {
+ printf("build_signal_reason: exceeded space in signal reason buf, unable to log procname\n");