From b065674fe309c30e9f0efcb98c5d47d8d29bc4bf Mon Sep 17 00:00:00 2001 From: Derek Parker Date: Sat, 28 Feb 2015 10:41:05 -0600 Subject: [PATCH] Handle set_pc errors --- proctl/registers_darwin_amd64.go | 5 ++++- proctl/threads_darwin.c | 7 +++---- proctl/threads_darwin.h | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/proctl/registers_darwin_amd64.go b/proctl/registers_darwin_amd64.go index a460ced6..80feb3da 100644 --- a/proctl/registers_darwin_amd64.go +++ b/proctl/registers_darwin_amd64.go @@ -17,7 +17,10 @@ func (r *Regs) SP() uint64 { } func (r *Regs) SetPC(thread *ThreadContext, pc uint64) error { - C.set_pc(thread.os.thread_act, C.uint64_t(pc)) + kret := C.set_pc(thread.os.thread_act, C.uint64_t(pc)) + if kret != C.KERN_SUCCESS { + return fmt.Errorf("could not set pc") + } return nil } diff --git a/proctl/threads_darwin.c b/proctl/threads_darwin.c index b2bfe607..16b56785 100644 --- a/proctl/threads_darwin.c +++ b/proctl/threads_darwin.c @@ -47,19 +47,18 @@ get_registers(mach_port_name_t task, x86_thread_state64_t *state) { } // TODO(dp) this should return kret instead of void -void +kern_return_t set_pc(thread_act_t task, uint64_t pc) { kern_return_t kret; x86_thread_state64_t state; mach_msg_type_number_t stateCount = x86_THREAD_STATE64_COUNT; kret = thread_get_state(task, x86_THREAD_STATE64, (thread_state_t)&state, &stateCount); - if (kret != KERN_SUCCESS) puts(mach_error_string(kret)); + if (kret != KERN_SUCCESS) return kret; state.__rip = pc; - kret = thread_set_state(task, x86_THREAD_STATE64, (thread_state_t)&state, stateCount); - if (kret != KERN_SUCCESS) puts(mach_error_string(kret)); // TODO(dp) - possible memory leak - vm_deallocate state + return thread_set_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 f2ad242b..e968f621 100644 --- a/proctl/threads_darwin.h +++ b/proctl/threads_darwin.h @@ -13,7 +13,7 @@ read_memory(mach_port_name_t, mach_vm_address_t, void *, mach_msg_type_number_t) kern_return_t get_registers(mach_port_name_t, x86_thread_state64_t*); -void +kern_return_t set_pc(thread_act_t, uint64_t); void