Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
034c6c3e
Commit
034c6c3e
authored
Jun 17, 2009
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
server: The ptrace interfaces uses longs, not ints.
parent
98b8160b
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
47 additions
and
46 deletions
+47
-46
ptrace.c
server/ptrace.c
+47
-46
No files found.
server/ptrace.c
View file @
034c6c3e
...
@@ -313,8 +313,8 @@ static int suspend_for_ptrace( struct thread *thread )
...
@@ -313,8 +313,8 @@ static int suspend_for_ptrace( struct thread *thread )
return
0
;
return
0
;
}
}
/* read a
n int
from a thread address space */
/* read a
long
from a thread address space */
static
int
read_thread_int
(
struct
thread
*
thread
,
int
*
addr
,
int
*
data
)
static
long
read_thread_long
(
struct
thread
*
thread
,
long
*
addr
,
long
*
data
)
{
{
errno
=
0
;
errno
=
0
;
*
data
=
ptrace
(
PTRACE_PEEKDATA
,
get_ptrace_pid
(
thread
),
(
caddr_t
)
addr
,
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 )
...
@@ -326,13 +326,13 @@ static int read_thread_int( struct thread *thread, int *addr, int *data )
return
0
;
return
0
;
}
}
/* write a
n int
to a thread address space */
/* write a
long
to a thread address space */
static
int
write_thread_int
(
struct
thread
*
thread
,
int
*
addr
,
int
data
,
unsigned
int
mask
)
static
long
write_thread_long
(
struct
thread
*
thread
,
long
*
addr
,
long
data
,
unsigned
long
mask
)
{
{
int
res
;
long
res
;
if
(
mask
!=
~
0u
)
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
);
data
=
(
data
&
mask
)
|
(
res
&
~
mask
);
}
}
if
((
res
=
ptrace
(
PTRACE_POKEDATA
,
get_ptrace_pid
(
thread
),
(
caddr_t
)
addr
,
data
))
==
-
1
)
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
...
@@ -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
);
struct
thread
*
thread
=
get_ptrace_thread
(
process
);
unsigned
int
first_offset
,
last_offset
,
len
;
unsigned
int
first_offset
,
last_offset
,
len
;
int
data
,
*
addr
;
long
data
,
*
addr
;
if
(
!
thread
)
return
0
;
if
(
!
thread
)
return
0
;
...
@@ -368,33 +368,33 @@ int read_process_memory( struct process *process, client_ptr_t ptr, data_size_t
...
@@ -368,33 +368,33 @@ int read_process_memory( struct process *process, client_ptr_t ptr, data_size_t
return
0
;
return
0
;
}
}
first_offset
=
ptr
%
sizeof
(
int
);
first_offset
=
ptr
%
sizeof
(
long
);
last_offset
=
(
size
+
first_offset
)
%
sizeof
(
int
);
last_offset
=
(
size
+
first_offset
)
%
sizeof
(
long
);
if
(
!
last_offset
)
last_offset
=
sizeof
(
int
);
if
(
!
last_offset
)
last_offset
=
sizeof
(
long
);
addr
=
(
int
*
)(
unsigned
long
)(
ptr
-
first_offset
);
addr
=
(
long
*
)(
unsigned
long
)(
ptr
-
first_offset
);
len
=
(
size
+
first_offset
+
sizeof
(
int
)
-
1
)
/
sizeof
(
int
);
len
=
(
size
+
first_offset
+
sizeof
(
long
)
-
1
)
/
sizeof
(
long
);
if
(
suspend_for_ptrace
(
thread
))
if
(
suspend_for_ptrace
(
thread
))
{
{
if
(
len
>
1
)
if
(
len
>
1
)
{
{
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
,
sizeof
(
int
)
-
first_offset
);
memcpy
(
dest
,
(
char
*
)
&
data
+
first_offset
,
sizeof
(
long
)
-
first_offset
);
dest
+=
sizeof
(
int
)
-
first_offset
;
dest
+=
sizeof
(
long
)
-
first_offset
;
first_offset
=
0
;
first_offset
=
0
;
len
--
;
len
--
;
}
}
while
(
len
>
1
)
while
(
len
>
1
)
{
{
if
(
read_thread_
int
(
thread
,
addr
++
,
&
data
)
==
-
1
)
goto
done
;
if
(
read_thread_
long
(
thread
,
addr
++
,
&
data
)
==
-
1
)
goto
done
;
memcpy
(
dest
,
&
data
,
sizeof
(
int
)
);
memcpy
(
dest
,
&
data
,
sizeof
(
long
)
);
dest
+=
sizeof
(
int
);
dest
+=
sizeof
(
long
);
len
--
;
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
);
memcpy
(
dest
,
(
char
*
)
&
data
+
first_offset
,
last_offset
-
first_offset
);
len
--
;
len
--
;
...
@@ -406,28 +406,29 @@ int read_process_memory( struct process *process, client_ptr_t ptr, data_size_t
...
@@ -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 */
/* make sure we can write to the whole address range */
/* len is the total size (in ints) */
/* 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
);
int
page
=
get_page_size
()
/
sizeof
(
int
);
for
(;;)
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
;
if
(
len
<=
page
)
break
;
addr
+=
page
;
addr
+=
page
;
len
-=
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 */
/* 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
)
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
);
struct
thread
*
thread
=
get_ptrace_thread
(
process
);
int
ret
=
0
,
data
=
0
;
int
ret
=
0
;
long
data
=
0
;
data_size_t
len
;
data_size_t
len
;
int
*
addr
;
long
*
addr
;
unsigned
int
first_mask
,
first_offset
,
last_mask
,
last_offset
;
unsigned
long
first_mask
,
first_offset
,
last_mask
,
last_offset
;
if
(
!
thread
)
return
0
;
if
(
!
thread
)
return
0
;
...
@@ -437,19 +438,19 @@ int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t
...
@@ -437,19 +438,19 @@ int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t
return
0
;
return
0
;
}
}
/* compute the mask for the first
int
*/
/* compute the mask for the first
long
*/
first_mask
=
~
0
;
first_mask
=
~
0
;
first_offset
=
ptr
%
sizeof
(
int
);
first_offset
=
ptr
%
sizeof
(
long
);
memset
(
&
first_mask
,
0
,
first_offset
);
memset
(
&
first_mask
,
0
,
first_offset
);
/* compute the mask for the last
int
*/
/* compute the mask for the last
long
*/
last_offset
=
(
size
+
first_offset
)
%
sizeof
(
int
);
last_offset
=
(
size
+
first_offset
)
%
sizeof
(
long
);
if
(
!
last_offset
)
last_offset
=
sizeof
(
int
);
if
(
!
last_offset
)
last_offset
=
sizeof
(
long
);
last_mask
=
0
;
last_mask
=
0
;
memset
(
&
last_mask
,
0xff
,
last_offset
);
memset
(
&
last_mask
,
0xff
,
last_offset
);
addr
=
(
int
*
)(
unsigned
long
)(
ptr
-
first_offset
);
addr
=
(
long
*
)(
unsigned
long
)(
ptr
-
first_offset
);
len
=
(
size
+
first_offset
+
sizeof
(
int
)
-
1
)
/
sizeof
(
int
);
len
=
(
size
+
first_offset
+
sizeof
(
long
)
-
1
)
/
sizeof
(
long
);
if
(
suspend_for_ptrace
(
thread
))
if
(
suspend_for_ptrace
(
thread
))
{
{
...
@@ -461,9 +462,9 @@ int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t
...
@@ -461,9 +462,9 @@ int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t
/* first word is special */
/* first word is special */
if
(
len
>
1
)
if
(
len
>
1
)
{
{
memcpy
(
(
char
*
)
&
data
+
first_offset
,
src
,
sizeof
(
int
)
-
first_offset
);
memcpy
(
(
char
*
)
&
data
+
first_offset
,
src
,
sizeof
(
long
)
-
first_offset
);
src
+=
sizeof
(
int
)
-
first_offset
;
src
+=
sizeof
(
long
)
-
first_offset
;
if
(
write_thread_
int
(
thread
,
addr
++
,
data
,
first_mask
)
==
-
1
)
goto
done
;
if
(
write_thread_
long
(
thread
,
addr
++
,
data
,
first_mask
)
==
-
1
)
goto
done
;
first_offset
=
0
;
first_offset
=
0
;
len
--
;
len
--
;
}
}
...
@@ -471,15 +472,15 @@ int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t
...
@@ -471,15 +472,15 @@ int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t
while
(
len
>
1
)
while
(
len
>
1
)
{
{
memcpy
(
&
data
,
src
,
sizeof
(
int
)
);
memcpy
(
&
data
,
src
,
sizeof
(
long
)
);
src
+=
sizeof
(
int
);
src
+=
sizeof
(
long
);
if
(
write_thread_
int
(
thread
,
addr
++
,
data
,
~
0
)
==
-
1
)
goto
done
;
if
(
write_thread_
long
(
thread
,
addr
++
,
data
,
~
0ul
)
==
-
1
)
goto
done
;
len
--
;
len
--
;
}
}
/* last word is special too */
/* last word is special too */
memcpy
(
(
char
*
)
&
data
+
first_offset
,
src
,
last_offset
-
first_offset
);
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
;
ret
=
1
;
done:
done:
...
@@ -504,13 +505,13 @@ void get_selector_entry( struct thread *thread, int entry, unsigned int *base,
...
@@ -504,13 +505,13 @@ void get_selector_entry( struct thread *thread, int entry, unsigned int *base,
}
}
if
(
suspend_for_ptrace
(
thread
))
if
(
suspend_for_ptrace
(
thread
))
{
{
unsigned
char
flags_buf
[
4
];
unsigned
char
flags_buf
[
sizeof
(
long
)
];
int
*
addr
=
(
int
*
)(
unsigned
long
)
thread
->
process
->
ldt_copy
+
entry
;
long
*
addr
=
(
long
*
)(
unsigned
long
)
thread
->
process
->
ldt_copy
+
entry
;
if
(
read_thread_
int
(
thread
,
addr
,
(
int
*
)
base
)
==
-
1
)
goto
done
;
if
(
read_thread_
long
(
thread
,
addr
,
(
long
*
)
base
)
==
-
1
)
goto
done
;
if
(
read_thread_
int
(
thread
,
addr
+
8192
,
(
int
*
)
limit
)
==
-
1
)
goto
done
;
if
(
read_thread_
long
(
thread
,
addr
+
8192
,
(
long
*
)
limit
)
==
-
1
)
goto
done
;
addr
=
(
int
*
)(
unsigned
long
)
thread
->
process
->
ldt_copy
+
2
*
8192
+
(
entry
>>
2
);
addr
=
(
long
*
)(
unsigned
long
)
thread
->
process
->
ldt_copy
+
2
*
8192
+
(
entry
/
sizeof
(
long
)
);
if
(
read_thread_
int
(
thread
,
addr
,
(
int
*
)
flags_buf
)
==
-
1
)
goto
done
;
if
(
read_thread_
long
(
thread
,
addr
,
(
long
*
)
flags_buf
)
==
-
1
)
goto
done
;
*
flags
=
flags_buf
[
entry
&
3
];
*
flags
=
flags_buf
[
entry
%
sizeof
(
long
)
];
done:
done:
resume_after_ptrace
(
thread
);
resume_after_ptrace
(
thread
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment