From 636719a4c63563e6d9d3d30a776cf927653faa80 Mon Sep 17 00:00:00 2001 From: Derek Parker Date: Sat, 28 Feb 2015 10:39:21 -0600 Subject: [PATCH] Handle thread_get_state errors --- proctl/registers_darwin_amd64.go | 7 ++++++- proctl/threads_darwin.c | 11 +++-------- proctl/threads_darwin.h | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/proctl/registers_darwin_amd64.go b/proctl/registers_darwin_amd64.go index 616f9033..a460ced6 100644 --- a/proctl/registers_darwin_amd64.go +++ b/proctl/registers_darwin_amd64.go @@ -2,6 +2,7 @@ package proctl // #include "threads_darwin.h" import "C" +import "fmt" type Regs struct { pc, sp uint64 @@ -21,7 +22,11 @@ func (r *Regs) SetPC(thread *ThreadContext, pc uint64) error { } func registers(thread *ThreadContext) (Registers, error) { - state := C.get_registers(C.mach_port_name_t(thread.os.thread_act)) + var state C.x86_thread_state64_t + kret := C.get_registers(C.mach_port_name_t(thread.os.thread_act), &state) + if kret != C.KERN_SUCCESS { + return nil, fmt.Errorf("could not get registers") + } regs := &Regs{pc: uint64(state.__rip), sp: uint64(state.__rsp)} return regs, nil } diff --git a/proctl/threads_darwin.c b/proctl/threads_darwin.c index 36800970..b2bfe607 100644 --- a/proctl/threads_darwin.c +++ b/proctl/threads_darwin.c @@ -37,18 +37,13 @@ read_memory(mach_port_name_t task, mach_vm_address_t addr, void *d, mach_msg_typ return count; } -x86_thread_state64_t -get_registers(mach_port_name_t task) { +kern_return_t +get_registers(mach_port_name_t task, x86_thread_state64_t *state) { kern_return_t kret; - x86_thread_state64_t state; mach_msg_type_number_t stateCount = x86_THREAD_STATE64_COUNT; // TODO(dp) - possible memory leak - vm_deallocate state - 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; + return thread_get_state(task, x86_THREAD_STATE64, (thread_state_t)state, &stateCount); } // TODO(dp) this should return kret instead of void diff --git a/proctl/threads_darwin.h b/proctl/threads_darwin.h index c0ce604f..f2ad242b 100644 --- a/proctl/threads_darwin.h +++ b/proctl/threads_darwin.h @@ -10,8 +10,8 @@ write_memory(mach_port_name_t, mach_vm_address_t, void *, mach_msg_type_number_t int read_memory(mach_port_name_t, mach_vm_address_t, void *, mach_msg_type_number_t); -x86_thread_state64_t -get_registers(mach_port_name_t); +kern_return_t +get_registers(mach_port_name_t, x86_thread_state64_t*); void set_pc(thread_act_t, uint64_t); -- GitLab