Alexandre Julliard : server: The ptrace interfaces uses longs, not ints.
Alexandre Julliard
julliard at winehq.org
Thu Jun 18 09:11:33 CDT 2009
Module: wine
Branch: master
Commit: 034c6c3e5809afcca8b3d319aa28832e0c00f7ff
URL: http://source.winehq.org/git/wine.git/?a=commit;h=034c6c3e5809afcca8b3d319aa28832e0c00f7ff
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jun 17 20:53:32 2009 +0200
server: The ptrace interfaces uses longs, not ints.
---
server/ptrace.c | 93 ++++++++++++++++++++++++++++---------------------------
1 files changed, 47 insertions(+), 46 deletions(-)
diff --git a/server/ptrace.c b/server/ptrace.c
index 72e2b44..4fa48ec 100644
--- a/server/ptrace.c
+++ b/server/ptrace.c
@@ -313,8 +313,8 @@ static int suspend_for_ptrace( struct thread *thread )
return 0;
}
-/* read an int from a thread address space */
-static int read_thread_int( struct thread *thread, int *addr, int *data )
+/* read a long from a thread address space */
+static long read_thread_long( struct thread *thread, long *addr, long *data )
{
errno = 0;
*data = ptrace( PTRACE_PEEKDATA, get_ptrace_pid(thread), (caddr_t)addr, 0 );
@@ -326,13 +326,13 @@ static int read_thread_int( struct thread *thread, int *addr, int *data )
return 0;
}
-/* write an int to a thread address space */
-static int write_thread_int( struct thread *thread, int *addr, int data, unsigned int mask )
+/* write a long to a thread address space */
+static long write_thread_long( struct thread *thread, long *addr, long data, unsigned long mask )
{
- int res;
+ long res;
if (mask != ~0u)
{
- if (read_thread_int( thread, addr, &res ) == -1) return -1;
+ if (read_thread_long( thread, addr, &res ) == -1) return -1;
data = (data & mask) | (res & ~mask);
}
if ((res = ptrace( PTRACE_POKEDATA, get_ptrace_pid(thread), (caddr_t)addr, data )) == -1)
@@ -358,7 +358,7 @@ int read_process_memory( struct process *process, client_ptr_t ptr, data_size_t
{
struct thread *thread = get_ptrace_thread( process );
unsigned int first_offset, last_offset, len;
- int data, *addr;
+ long data, *addr;
if (!thread) return 0;
@@ -368,33 +368,33 @@ int read_process_memory( struct process *process, client_ptr_t ptr, data_size_t
return 0;
}
- first_offset = ptr % sizeof(int);
- last_offset = (size + first_offset) % sizeof(int);
- if (!last_offset) last_offset = sizeof(int);
+ first_offset = ptr % sizeof(long);
+ last_offset = (size + first_offset) % sizeof(long);
+ if (!last_offset) last_offset = sizeof(long);
- addr = (int *)(unsigned long)(ptr - first_offset);
- len = (size + first_offset + sizeof(int) - 1) / sizeof(int);
+ addr = (long *)(unsigned long)(ptr - first_offset);
+ len = (size + first_offset + sizeof(long) - 1) / sizeof(long);
if (suspend_for_ptrace( thread ))
{
if (len > 1)
{
- if (read_thread_int( thread, addr++, &data ) == -1) goto done;
- memcpy( dest, (char *)&data + first_offset, sizeof(int) - first_offset );
- dest += sizeof(int) - first_offset;
+ if (read_thread_long( thread, addr++, &data ) == -1) goto done;
+ memcpy( dest, (char *)&data + first_offset, sizeof(long) - first_offset );
+ dest += sizeof(long) - first_offset;
first_offset = 0;
len--;
}
while (len > 1)
{
- if (read_thread_int( thread, addr++, &data ) == -1) goto done;
- memcpy( dest, &data, sizeof(int) );
- dest += sizeof(int);
+ if (read_thread_long( thread, addr++, &data ) == -1) goto done;
+ memcpy( dest, &data, sizeof(long) );
+ dest += sizeof(long);
len--;
}
- if (read_thread_int( thread, addr++, &data ) == -1) goto done;
+ if (read_thread_long( thread, addr++, &data ) == -1) goto done;
memcpy( dest, (char *)&data + first_offset, last_offset - first_offset );
len--;
@@ -406,28 +406,29 @@ int read_process_memory( struct process *process, client_ptr_t ptr, data_size_t
/* make sure we can write to the whole address range */
/* len is the total size (in ints) */
-static int check_process_write_access( struct thread *thread, int *addr, data_size_t len )
+static int check_process_write_access( struct thread *thread, long *addr, data_size_t len )
{
int page = get_page_size() / sizeof(int);
for (;;)
{
- if (write_thread_int( thread, addr, 0, 0 ) == -1) return 0;
+ if (write_thread_long( thread, addr, 0, 0 ) == -1) return 0;
if (len <= page) break;
addr += page;
len -= page;
}
- return (write_thread_int( thread, addr + len - 1, 0, 0 ) != -1);
+ return (write_thread_long( thread, addr + len - 1, 0, 0 ) != -1);
}
/* write data to a process memory space */
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;
+ int ret = 0;
+ long data = 0;
data_size_t len;
- int *addr;
- unsigned int first_mask, first_offset, last_mask, last_offset;
+ long *addr;
+ unsigned long first_mask, first_offset, last_mask, last_offset;
if (!thread) return 0;
@@ -437,19 +438,19 @@ int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t
return 0;
}
- /* compute the mask for the first int */
+ /* compute the mask for the first long */
first_mask = ~0;
- first_offset = ptr % sizeof(int);
+ first_offset = ptr % sizeof(long);
memset( &first_mask, 0, first_offset );
- /* compute the mask for the last int */
- last_offset = (size + first_offset) % sizeof(int);
- if (!last_offset) last_offset = sizeof(int);
+ /* compute the mask for the last long */
+ last_offset = (size + first_offset) % sizeof(long);
+ if (!last_offset) last_offset = sizeof(long);
last_mask = 0;
memset( &last_mask, 0xff, last_offset );
- addr = (int *)(unsigned long)(ptr - first_offset);
- len = (size + first_offset + sizeof(int) - 1) / sizeof(int);
+ addr = (long *)(unsigned long)(ptr - first_offset);
+ len = (size + first_offset + sizeof(long) - 1) / sizeof(long);
if (suspend_for_ptrace( thread ))
{
@@ -461,9 +462,9 @@ int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t
/* first word is special */
if (len > 1)
{
- memcpy( (char *)&data + first_offset, src, sizeof(int) - first_offset );
- src += sizeof(int) - first_offset;
- if (write_thread_int( thread, addr++, data, first_mask ) == -1) goto done;
+ memcpy( (char *)&data + first_offset, src, sizeof(long) - first_offset );
+ src += sizeof(long) - first_offset;
+ if (write_thread_long( thread, addr++, data, first_mask ) == -1) goto done;
first_offset = 0;
len--;
}
@@ -471,15 +472,15 @@ int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t
while (len > 1)
{
- memcpy( &data, src, sizeof(int) );
- src += sizeof(int);
- if (write_thread_int( thread, addr++, data, ~0 ) == -1) goto done;
+ memcpy( &data, src, sizeof(long) );
+ src += sizeof(long);
+ if (write_thread_long( thread, addr++, data, ~0ul ) == -1) goto done;
len--;
}
/* last word is special too */
memcpy( (char *)&data + first_offset, src, last_offset - first_offset );
- if (write_thread_int( thread, addr, data, last_mask ) == -1) goto done;
+ if (write_thread_long( thread, addr, data, last_mask ) == -1) goto done;
ret = 1;
done:
@@ -504,13 +505,13 @@ void get_selector_entry( struct thread *thread, int entry, unsigned int *base,
}
if (suspend_for_ptrace( thread ))
{
- unsigned char flags_buf[4];
- int *addr = (int *)(unsigned long)thread->process->ldt_copy + entry;
- if (read_thread_int( thread, addr, (int *)base ) == -1) goto done;
- if (read_thread_int( thread, addr + 8192, (int *)limit ) == -1) goto done;
- addr = (int *)(unsigned long)thread->process->ldt_copy + 2*8192 + (entry >> 2);
- if (read_thread_int( thread, addr, (int *)flags_buf ) == -1) goto done;
- *flags = flags_buf[entry & 3];
+ unsigned char flags_buf[sizeof(long)];
+ long *addr = (long *)(unsigned long)thread->process->ldt_copy + entry;
+ if (read_thread_long( thread, addr, (long *)base ) == -1) goto done;
+ if (read_thread_long( thread, addr + 8192, (long *)limit ) == -1) goto done;
+ addr = (long *)(unsigned long)thread->process->ldt_copy + 2*8192 + (entry / sizeof(long));
+ if (read_thread_long( thread, addr, (long *)flags_buf ) == -1) goto done;
+ *flags = flags_buf[entry % sizeof(long)];
done:
resume_after_ptrace( thread );
}
More information about the wine-cvs
mailing list