[PATCH 50] ptrace_request: use ptrace_lookup_engine()
Oleg Nesterov
oleg at redhat.com
Thu Sep 17 19:08:28 UTC 2009
Change ptrace_request() to find utrace_engine and pass it to callees.
---
kernel/ptrace.c | 63 +++++++++++++++++++++++---------------------------------
1 file changed, 26 insertions(+), 37 deletions(-)
--- PU/kernel/ptrace.c~50_PTRACE_REQUEST_LOOKUP_ENGINE 2009-09-17 20:46:55.000000000 +0200
+++ PU/kernel/ptrace.c 2009-09-17 21:03:11.000000000 +0200
@@ -806,27 +806,20 @@ int ptrace_writedata(struct task_struct
return copied;
}
-static int ptrace_set_options(struct task_struct *child, long data)
+static int ptrace_set_options(struct utrace_engine *engine,
+ struct task_struct *child, long data)
{
- struct utrace_engine *engine = ptrace_lookup_engine(child);
-
- if (likely(!IS_ERR(engine))) {
- __ptrace_set_options(child, engine, data & PTRACE_O_MASK);
- utrace_engine_put(engine);
- }
+ __ptrace_set_options(child, engine, data & PTRACE_O_MASK);
return (data & ~PTRACE_O_MASK) ? -EINVAL : 0;
}
-static int ptrace_getsiginfo(struct task_struct *child, siginfo_t *info)
+static int ptrace_getsiginfo(struct utrace_engine *engine,
+ struct task_struct *child, siginfo_t *info)
{
- struct utrace_engine *engine = ptrace_lookup_engine(child);
unsigned long flags;
int error = -ESRCH;
- if (IS_ERR(engine))
- return error;
-
if (lock_task_sighand(child, &flags)) {
error = -EINVAL;
if (likely(ptrace_context(engine)->siginfo != NULL)) {
@@ -836,19 +829,15 @@ static int ptrace_getsiginfo(struct task
unlock_task_sighand(child, &flags);
}
- utrace_engine_put(engine);
return error;
}
-static int ptrace_setsiginfo(struct task_struct *child, const siginfo_t *info)
+static int ptrace_setsiginfo(struct utrace_engine *engine,
+ struct task_struct *child, const siginfo_t *info)
{
- struct utrace_engine *engine = ptrace_lookup_engine(child);
unsigned long flags;
int error = -ESRCH;
- if (IS_ERR(engine))
- return error;
-
if (lock_task_sighand(child, &flags)) {
error = -EINVAL;
if (likely(ptrace_context(engine)->siginfo != NULL)) {
@@ -858,7 +847,6 @@ static int ptrace_setsiginfo(struct task
unlock_task_sighand(child, &flags);
}
- utrace_engine_put(engine);
return error;
}
@@ -965,10 +953,9 @@ static void do_ptrace_resume(struct utra
ptrace_wake_up(engine, tracee, UTRACE_RESUME);
}
-static int ptrace_resume(struct task_struct *child, long request, long data)
+static int ptrace_resume(struct utrace_engine *engine,
+ struct task_struct *child, long request, long data)
{
- struct utrace_engine *engine;
- struct ptrace_context *context;
enum utrace_resume_action action;
enum utrace_syscall_action syscall;
int ret = 0;
@@ -976,12 +963,6 @@ static int ptrace_resume(struct task_str
if (!valid_signal(data))
return -EIO;
- engine = ptrace_lookup_engine(child);
- if (IS_ERR(engine))
- return -ESRCH;
-
- context = ptrace_context(engine);
-
syscall = UTRACE_SYSCALL_RUN;
#ifdef PTRACE_SYSEMU
if (request == PTRACE_SYSEMU || request == PTRACE_SYSEMU_SINGLESTEP)
@@ -1013,17 +994,19 @@ static int ptrace_resume(struct task_str
if (!ret)
do_ptrace_resume(engine, child, request, data);
- utrace_engine_put(engine);
-
return ret;
}
int ptrace_request(struct task_struct *child, long request,
long addr, long data)
{
+ struct utrace_engine *engine = ptrace_lookup_engine(child);
siginfo_t siginfo;
int ret;
+ if (unlikely(IS_ERR(engine)))
+ return -ESRCH;
+
switch (request) {
case PTRACE_PEEKTEXT:
case PTRACE_PEEKDATA:
@@ -1038,14 +1021,14 @@ int ptrace_request(struct task_struct *c
case PTRACE_OLDSETOPTIONS:
#endif
case PTRACE_SETOPTIONS:
- ret = ptrace_set_options(child, data);
+ ret = ptrace_set_options(engine, child, data);
break;
case PTRACE_GETEVENTMSG:
ret = put_user(child->ptrace_message, (unsigned long __user *) data);
break;
case PTRACE_GETSIGINFO:
- ret = ptrace_getsiginfo(child, &siginfo);
+ ret = ptrace_getsiginfo(engine, child, &siginfo);
if (!ret)
ret = copy_siginfo_to_user((siginfo_t __user *) data,
&siginfo);
@@ -1056,7 +1039,7 @@ int ptrace_request(struct task_struct *c
sizeof siginfo))
ret = -EFAULT;
else
- ret = ptrace_setsiginfo(child, &siginfo);
+ ret = ptrace_setsiginfo(engine, child, &siginfo);
break;
case PTRACE_DETACH: /* detach a process that was attached. */
@@ -1075,13 +1058,13 @@ int ptrace_request(struct task_struct *c
#endif
case PTRACE_SYSCALL:
case PTRACE_CONT:
- ret = ptrace_resume(child, request, data);
+ ret = ptrace_resume(engine, child, request, data);
break;
case PTRACE_KILL:
ret = 0;
if (!child->exit_state) /* already dead */
- ret = ptrace_resume(child, request, SIGKILL);
+ ret = ptrace_resume(engine, child, request, SIGKILL);
break;
default:
@@ -1089,6 +1072,7 @@ int ptrace_request(struct task_struct *c
break;
}
+ utrace_engine_put(engine);
return ret;
}
@@ -1182,11 +1166,15 @@ int generic_ptrace_pokedata(struct task_
int compat_ptrace_request(struct task_struct *child, compat_long_t request,
compat_ulong_t addr, compat_ulong_t data)
{
+ struct utrace_engine *engine = ptrace_lookup_engine(child);
compat_ulong_t __user *datap = compat_ptr(data);
compat_ulong_t word;
siginfo_t siginfo;
int ret;
+ if (unlikely(IS_ERR(engine)))
+ return -ESRCH;
+
switch (request) {
case PTRACE_PEEKTEXT:
case PTRACE_PEEKDATA:
@@ -1208,7 +1196,7 @@ int compat_ptrace_request(struct task_st
break;
case PTRACE_GETSIGINFO:
- ret = ptrace_getsiginfo(child, &siginfo);
+ ret = ptrace_getsiginfo(engine, child, &siginfo);
if (!ret)
ret = copy_siginfo_to_user32(
(struct compat_siginfo __user *) datap,
@@ -1221,13 +1209,14 @@ int compat_ptrace_request(struct task_st
&siginfo, (struct compat_siginfo __user *) datap))
ret = -EFAULT;
else
- ret = ptrace_setsiginfo(child, &siginfo);
+ ret = ptrace_setsiginfo(engine, child, &siginfo);
break;
default:
ret = ptrace_request(child, request, addr, data);
}
+ utrace_engine_put(engine);
return ret;
}
More information about the utrace-devel
mailing list