git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git]
/
arch
/
x86_64
/
kernel
/
ptrace.c
diff --git
a/arch/x86_64/kernel/ptrace.c
b/arch/x86_64/kernel/ptrace.c
index
2d50024
..
5320562
100644
(file)
--- a/
arch/x86_64/kernel/ptrace.c
+++ b/
arch/x86_64/kernel/ptrace.c
@@
-274,6
+274,11
@@
static int putreg(struct task_struct *child,
return -EIO;
value &= 0xffff;
break;
return -EIO;
value &= 0xffff;
break;
+ case offsetof(struct user_regs_struct, rip):
+ /* Check if the new RIP address is canonical */
+ if (value >= TASK_SIZE_OF(child))
+ return -EIO;
+ break;
}
put_stack_long(child, regno - sizeof(struct pt_regs), value);
return 0;
}
put_stack_long(child, regno - sizeof(struct pt_regs), value);
return 0;
@@
-415,9
+420,9
@@
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
case offsetof(struct user, u_debugreg[7]):
/* See arch/i386/kernel/ptrace.c for an explanation of
* this awkward check.*/
case offsetof(struct user, u_debugreg[7]):
/* See arch/i386/kernel/ptrace.c for an explanation of
* this awkward check.*/
- data &= ~DR_CONTROL_RESERVED;
- for(i=0; i<4; i++)
-
if ((0x55
54 >> ((data >> (16 + 4*i)) & 0xf)) & 1)
+
data &= ~DR_CONTROL_RESERVED;
+
for(i=0; i<4; i++)
+
if ((0x54
54 >> ((data >> (16 + 4*i)) & 0xf)) & 1)
break;
if (i == 4) {
child->thread.debugreg7 = data;
break;
if (i == 4) {
child->thread.debugreg7 = data;
@@
-600,12
+605,12
@@
asmlinkage void syscall_trace_enter(struct pt_regs *regs)
if (unlikely(current->audit_context)) {
if (test_thread_flag(TIF_IA32)) {
if (unlikely(current->audit_context)) {
if (test_thread_flag(TIF_IA32)) {
- audit_syscall_entry(AUDIT_ARCH_I386,
+ audit_syscall_entry(
current,
AUDIT_ARCH_I386,
regs->orig_rax,
regs->rbx, regs->rcx,
regs->rdx, regs->rsi);
} else {
regs->orig_rax,
regs->rbx, regs->rcx,
regs->rdx, regs->rsi);
} else {
- audit_syscall_entry(AUDIT_ARCH_X86_64,
+ audit_syscall_entry(
current,
AUDIT_ARCH_X86_64,
regs->orig_rax,
regs->rdi, regs->rsi,
regs->rdx, regs->r10);
regs->orig_rax,
regs->rdi, regs->rsi,
regs->rdx, regs->r10);
@@
-616,7
+621,7
@@
asmlinkage void syscall_trace_enter(struct pt_regs *regs)
asmlinkage void syscall_trace_leave(struct pt_regs *regs)
{
if (unlikely(current->audit_context))
asmlinkage void syscall_trace_leave(struct pt_regs *regs)
{
if (unlikely(current->audit_context))
- audit_syscall_exit(AUDITSC_RESULT(regs->rax), regs->rax);
+ audit_syscall_exit(
current,
AUDITSC_RESULT(regs->rax), regs->rax);
if ((test_thread_flag(TIF_SYSCALL_TRACE)
|| test_thread_flag(TIF_SINGLESTEP))
if ((test_thread_flag(TIF_SYSCALL_TRACE)
|| test_thread_flag(TIF_SINGLESTEP))