server: Make the address argument for read/write_process_memory a client_ptr_t.
diff --git a/server/ptrace.c b/server/ptrace.c index 343e38e..accaf4d 100644 --- a/server/ptrace.c +++ b/server/ptrace.c
@@ -354,7 +354,7 @@ } /* read data from a process memory space */ -int read_process_memory( struct process *process, const void *ptr, data_size_t size, char *dest ) +int read_process_memory( struct process *process, client_ptr_t ptr, data_size_t size, char *dest ) { struct thread *thread = get_ptrace_thread( process ); unsigned int first_offset, last_offset, len; @@ -362,11 +362,17 @@ if (!thread) return 0; - first_offset = (unsigned long)ptr % sizeof(int); + if ((unsigned long)ptr != ptr) + { + set_error( STATUS_ACCESS_DENIED ); + return 0; + } + + first_offset = ptr % sizeof(int); last_offset = (size + first_offset) % sizeof(int); if (!last_offset) last_offset = sizeof(int); - addr = (int *)((char *)ptr - first_offset); + addr = (int *)(unsigned long)(ptr - first_offset); len = (size + first_offset + sizeof(int) - 1) / sizeof(int); if (suspend_for_ptrace( thread )) @@ -415,7 +421,7 @@ } /* write data to a process memory space */ -int write_process_memory( struct process *process, void *ptr, data_size_t size, const char *src ) +int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t size, const char *src ) { struct thread *thread = get_ptrace_thread( process ); int ret = 0, data = 0; @@ -425,9 +431,15 @@ if (!thread) return 0; + if ((unsigned long)ptr != ptr) + { + set_error( STATUS_ACCESS_DENIED ); + return 0; + } + /* compute the mask for the first int */ first_mask = ~0; - first_offset = (unsigned long)ptr % sizeof(int); + first_offset = ptr % sizeof(int); memset( &first_mask, 0, first_offset ); /* compute the mask for the last int */ @@ -436,7 +448,7 @@ last_mask = 0; memset( &last_mask, 0xff, last_offset ); - addr = (int *)((char *)ptr - first_offset); + addr = (int *)(unsigned long)(ptr - first_offset); len = (size + first_offset + sizeof(int) - 1) / sizeof(int); if (suspend_for_ptrace( thread ))