server: Make the address argument for read/write_process_memory a client_ptr_t.
diff --git a/server/mach.c b/server/mach.c
index 345fb27..05652ab 100644
--- a/server/mach.c
+++ b/server/mach.c
@@ -292,7 +292,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 )
{
kern_return_t ret;
mach_msg_type_number_t bytes_read;
@@ -307,6 +307,11 @@
set_error( STATUS_ACCESS_DENIED );
return 0;
}
+ if ((vm_address_t)ptr != ptr)
+ {
+ set_error( STATUS_ACCESS_DENIED );
+ return 0;
+ }
if ((ret = task_suspend( process_port )) != KERN_SUCCESS)
{
@@ -314,8 +319,8 @@
return 0;
}
- offset = (unsigned long)ptr % page_size;
- aligned_address = (vm_address_t)((char *)ptr - offset);
+ offset = ptr % page_size;
+ aligned_address = (vm_address_t)(ptr - offset);
aligned_size = (size + offset + page_size - 1) / page_size * page_size;
ret = vm_read( process_port, aligned_address, aligned_size, &data, &bytes_read );
@@ -330,7 +335,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 )
{
kern_return_t ret;
vm_address_t aligned_address, region_address;
@@ -347,9 +352,14 @@
set_error( STATUS_ACCESS_DENIED );
return 0;
}
+ if ((vm_address_t)ptr != ptr)
+ {
+ set_error( STATUS_ACCESS_DENIED );
+ return 0;
+ }
- offset = (unsigned long)ptr % page_size;
- aligned_address = (vm_address_t)((char *)ptr - offset);
+ offset = ptr % page_size;
+ aligned_address = (vm_address_t)(ptr - offset);
aligned_size = (size + offset + page_size - 1) / page_size * page_size;
if ((ret = task_suspend( process_port )) != KERN_SUCCESS)