diff --git a/proctl/proctl_darwin.c b/proctl/proctl_darwin.c index 7b19c1aa..3a643bfc 100644 --- a/proctl/proctl_darwin.c +++ b/proctl/proctl_darwin.c @@ -67,6 +67,10 @@ get_threads(task_t task, void *slice) { } memcpy(slice, (void*)list, count*sizeof(list[0])); + + kret = vm_deallocate(task, (vm_address_t) &list, count * sizeof(list[0])); + if (kret != KERN_SUCCESS) return kret; + return (kern_return_t)0; } @@ -76,9 +80,12 @@ thread_count(task_t task) { thread_act_array_t list; mach_msg_type_number_t count; - // TODO(dp) vm_deallocate list kret = task_threads(task, &list, &count); if (kret != KERN_SUCCESS) return -1; + + kret = vm_deallocate(task, (vm_address_t) &list, count * sizeof(list[0])); + if (kret != KERN_SUCCESS) return -1; + return count; } @@ -114,6 +121,8 @@ catch_mach_exception_raise( mach_exception_data_t code, mach_msg_type_number_t codeCnt) { + _global_thread = (thread_act_t)thread; + thread_suspend(thread); return KERN_SUCCESS; } diff --git a/proctl/threads_darwin.c b/proctl/threads_darwin.c index 6398179a..36800970 100644 --- a/proctl/threads_darwin.c +++ b/proctl/threads_darwin.c @@ -29,8 +29,11 @@ read_memory(mach_port_name_t task, mach_vm_address_t addr, void *d, mach_msg_typ kret = mach_vm_read((vm_map_t)task, addr, len, &data, &count); if (kret != KERN_SUCCESS) return -1; - // TODO(dp) possible memory leak - vm_deallocate data memcpy(d, (void *)data, len); + + kret = vm_deallocate(task, data, len); + if (kret != KERN_SUCCESS) return -1; + return count; } @@ -44,6 +47,7 @@ get_registers(mach_port_name_t task) { kret = thread_get_state(task, x86_THREAD_STATE64, (thread_state_t)&state, &stateCount); if (kret != KERN_SUCCESS) printf("SOMETHING WENT WRONG-------------- %d\n", kret); if (kret == KERN_INVALID_ARGUMENT) puts("INAVLID ARGUMENT"); + return state; }