diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2012-03-23 18:02:41 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-23 19:58:40 -0400 |
commit | 86b6c1f301faf085de5a3f9ce16b8de6e69c729b (patch) | |
tree | 115a168d533a54f4e3dc1ed195c58b65a71d8627 /kernel/ptrace.c | |
parent | 8c5cf9e5c50dc902713897e10201aa71f3546aa1 (diff) |
ptrace: simplify PTRACE_foo constants and PTRACE_SETOPTIONS code
Exchange PT_TRACESYSGOOD and PT_PTRACE_CAP bit positions, which makes
PT_option bits contiguous and therefore makes code in
ptrace_setoptions() much simpler.
Every PTRACE_O_TRACEevent is defined to (1 << PTRACE_EVENT_event)
instead of using explicit numeric constants, to ensure we don't mess up
relationship between bit positions and event ids.
PT_EVENT_FLAG_SHIFT was not particularly useful, PT_OPT_FLAG_SHIFT with
value of PT_EVENT_FLAG_SHIFT-1 is easier to use.
PT_TRACE_MASK constant is nuked, the only its use is replaced by
(PTRACE_O_MASK << PT_OPT_FLAG_SHIFT).
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Acked-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Cc: Pedro Alves <palves@redhat.com>
Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/ptrace.c')
-rw-r--r-- | kernel/ptrace.c | 31 |
1 files changed, 8 insertions, 23 deletions
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 273f56ea39d2..9acd07a6f5bb 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -262,7 +262,7 @@ static int ptrace_attach(struct task_struct *task, long request, | |||
262 | 262 | ||
263 | /* | 263 | /* |
264 | * Protect exec's credential calculations against our interference; | 264 | * Protect exec's credential calculations against our interference; |
265 | * interference; SUID, SGID and LSM creds get determined differently | 265 | * SUID, SGID and LSM creds get determined differently |
266 | * under ptrace. | 266 | * under ptrace. |
267 | */ | 267 | */ |
268 | retval = -ERESTARTNOINTR; | 268 | retval = -ERESTARTNOINTR; |
@@ -528,31 +528,16 @@ int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long ds | |||
528 | 528 | ||
529 | static int ptrace_setoptions(struct task_struct *child, unsigned long data) | 529 | static int ptrace_setoptions(struct task_struct *child, unsigned long data) |
530 | { | 530 | { |
531 | unsigned flags; | ||
532 | |||
531 | if (data & ~(unsigned long)PTRACE_O_MASK) | 533 | if (data & ~(unsigned long)PTRACE_O_MASK) |
532 | return -EINVAL; | 534 | return -EINVAL; |
533 | 535 | ||
534 | child->ptrace &= ~PT_TRACE_MASK; | 536 | /* Avoid intermediate state when all opts are cleared */ |
535 | 537 | flags = child->ptrace; | |
536 | if (data & PTRACE_O_TRACESYSGOOD) | 538 | flags &= ~(PTRACE_O_MASK << PT_OPT_FLAG_SHIFT); |
537 | child->ptrace |= PT_TRACESYSGOOD; | 539 | flags |= (data << PT_OPT_FLAG_SHIFT); |
538 | 540 | child->ptrace = flags; | |
539 | if (data & PTRACE_O_TRACEFORK) | ||
540 | child->ptrace |= PT_TRACE_FORK; | ||
541 | |||
542 | if (data & PTRACE_O_TRACEVFORK) | ||
543 | child->ptrace |= PT_TRACE_VFORK; | ||
544 | |||
545 | if (data & PTRACE_O_TRACECLONE) | ||
546 | child->ptrace |= PT_TRACE_CLONE; | ||
547 | |||
548 | if (data & PTRACE_O_TRACEEXEC) | ||
549 | child->ptrace |= PT_TRACE_EXEC; | ||
550 | |||
551 | if (data & PTRACE_O_TRACEVFORKDONE) | ||
552 | child->ptrace |= PT_TRACE_VFORK_DONE; | ||
553 | |||
554 | if (data & PTRACE_O_TRACEEXIT) | ||
555 | child->ptrace |= PT_TRACE_EXIT; | ||
556 | 541 | ||
557 | return 0; | 542 | return 0; |
558 | } | 543 | } |