diff options
| author | Linus Torvalds <torvalds@home.transmeta.com> | 2003-02-15 20:21:12 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2003-02-15 20:21:12 -0800 |
| commit | 6ed4b2d7048ca448c2a5941442cf60625905b55f (patch) | |
| tree | f4bf3e964d95bf3bb56eb013403e05dcae84aa98 | |
| parent | b9327242c0b7977c64cc49e03178c5e8db9729cd (diff) | |
| parent | d946b9ee265d41ea5015fd85028b202605836f9b (diff) | |
Merge bk://ptrace.bkbits.net/for-linus-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
32 files changed, 62 insertions, 47 deletions
diff --git a/arch/alpha/kernel/asm-offsets.c b/arch/alpha/kernel/asm-offsets.c index c1f42cb25d3b..79b9b27166a3 100644 --- a/arch/alpha/kernel/asm-offsets.c +++ b/arch/alpha/kernel/asm-offsets.c @@ -7,6 +7,7 @@ #include <linux/types.h> #include <linux/stddef.h> #include <linux/sched.h> +#include <linux/ptrace.h> #include <asm/io.h> #define DEFINE(sym, val) \ diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index f9934af388ed..c6d707e5bdf3 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c @@ -36,6 +36,7 @@ #include <linux/mc146818rtc.h> #include <linux/module.h> #include <linux/kallsyms.h> +#include <linux/ptrace.h> #include <asm/uaccess.h> #include <asm/pgtable.h> diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index 234ced527110..bca393dbee66 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c @@ -24,6 +24,7 @@ #include <linux/interrupt.h> #include <linux/highmem.h> #include <linux/kallsyms.h> +#include <linux/ptrace.h> #ifdef CONFIG_EISA #include <linux/ioport.h> diff --git a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c index 269cf00ddf4e..ea5b776be202 100644 --- a/arch/i386/kernel/vm86.c +++ b/arch/i386/kernel/vm86.c @@ -40,6 +40,7 @@ #include <linux/smp.h> #include <linux/smp_lock.h> #include <linux/highmem.h> +#include <linux/ptrace.h> #include <asm/uaccess.h> #include <asm/pgalloc.h> diff --git a/arch/i386/math-emu/fpu_entry.c b/arch/i386/math-emu/fpu_entry.c index c37a93bea50b..baebe5c08da7 100644 --- a/arch/i386/math-emu/fpu_entry.c +++ b/arch/i386/math-emu/fpu_entry.c @@ -25,6 +25,7 @@ +---------------------------------------------------------------------------*/ #include <linux/signal.h> +#include <linux/ptrace.h> #include <asm/uaccess.h> #include <asm/desc.h> diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index 65860c3865a5..3fa05f5351b4 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c @@ -29,6 +29,7 @@ #include <linux/string.h> #include <linux/linkage.h> #include <linux/init.h> +#include <linux/ptrace.h> #include <asm/setup.h> #include <asm/fpu.h> diff --git a/arch/m68knommu/kernel/asm-offsets.c b/arch/m68knommu/kernel/asm-offsets.c index 8c81e421a030..c803fe64e2ce 100644 --- a/arch/m68knommu/kernel/asm-offsets.c +++ b/arch/m68knommu/kernel/asm-offsets.c @@ -11,6 +11,7 @@ #include <linux/stddef.h> #include <linux/sched.h> #include <linux/kernel_stat.h> +#include <linux/ptrace.h> #include <asm/bootinfo.h> #include <asm/irq.h> #include <asm/hardirq.h> diff --git a/arch/m68knommu/kernel/traps.c b/arch/m68knommu/kernel/traps.c index 45283b564eb8..7373bbf38db6 100644 --- a/arch/m68knommu/kernel/traps.c +++ b/arch/m68knommu/kernel/traps.c @@ -27,6 +27,7 @@ #include <linux/string.h> #include <linux/linkage.h> #include <linux/init.h> +#include <linux/ptrace.h> #include <asm/setup.h> #include <asm/fpu.h> diff --git a/arch/mips/kernel/irixsig.c b/arch/mips/kernel/irixsig.c index cc687306facc..088f746119c6 100644 --- a/arch/mips/kernel/irixsig.c +++ b/arch/mips/kernel/irixsig.c @@ -12,6 +12,7 @@ #include <linux/smp.h> #include <linux/smp_lock.h> #include <linux/time.h> +#include <linux/ptrace.h> #include <asm/ptrace.h> #include <asm/uaccess.h> diff --git a/arch/mips/kernel/sysmips.c b/arch/mips/kernel/sysmips.c index f8664242b8d7..5a21cd0083e9 100644 --- a/arch/mips/kernel/sysmips.c +++ b/arch/mips/kernel/sysmips.c @@ -16,6 +16,7 @@ #include <linux/sched.h> #include <linux/string.h> #include <linux/utsname.h> +#include <linux/ptrace.h> #include <asm/cachectl.h> #include <asm/pgalloc.h> diff --git a/arch/parisc/hpux/fs.c b/arch/parisc/hpux/fs.c index afe8ae65540f..c22c789091e1 100644 --- a/arch/parisc/hpux/fs.c +++ b/arch/parisc/hpux/fs.c @@ -9,6 +9,7 @@ #include <linux/file.h> #include <linux/smp_lock.h> #include <linux/slab.h> +#include <linux/ptrace.h> #include <asm/errno.h> #include <asm/uaccess.h> diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c index 3e2d0013d340..4d6a5cf7dd21 100644 --- a/arch/parisc/kernel/sys_parisc32.c +++ b/arch/parisc/kernel/sys_parisc32.c @@ -53,6 +53,7 @@ #include <linux/binfmts.h> #include <linux/namei.h> #include <linux/vfs.h> +#include <linux/ptrace.h> #include <asm/types.h> #include <asm/uaccess.h> diff --git a/arch/ppc64/kernel/process.c b/arch/ppc64/kernel/process.c index c81d2cd02772..3b40722bd703 100644 --- a/arch/ppc64/kernel/process.c +++ b/arch/ppc64/kernel/process.c @@ -31,6 +31,7 @@ #include <linux/init.h> #include <linux/init_task.h> #include <linux/prctl.h> +#include <linux/ptrace.h> #include <asm/pgtable.h> #include <asm/uaccess.h> diff --git a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c index b8a0424c0e6c..b5ddbaac34de 100644 --- a/arch/ppc64/kernel/sys_ppc32.c +++ b/arch/ppc64/kernel/sys_ppc32.c @@ -58,6 +58,7 @@ #include <linux/dnotify.h> #include <linux/security.h> #include <linux/compat.h> +#include <linux/ptrace.h> #include <asm/types.h> #include <asm/ipc.h> diff --git a/arch/s390x/kernel/linux32.c b/arch/s390x/kernel/linux32.c index fce07ff5aae3..fc87ddddf687 100644 --- a/arch/s390x/kernel/linux32.c +++ b/arch/s390x/kernel/linux32.c @@ -58,6 +58,7 @@ #include <linux/binfmts.h> #include <linux/compat.h> #include <linux/vfs.h> +#include <linux/ptrace.h> #include <asm/types.h> #include <asm/ipc.h> diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index 62fdca125d9d..7f3653647f6b 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c @@ -15,6 +15,7 @@ #include <linux/mm.h> #include <linux/slab.h> #include <linux/a.out.h> +#include <linux/ptrace.h> #include <asm/io.h> #include <asm/uaccess.h> diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index 1f2fb2b35849..eadc30630cd8 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c @@ -54,6 +54,7 @@ #include <linux/compat.h> #include <linux/vfs.h> #include <linux/netfilter_ipv4/ip_tables.h> +#include <linux/ptrace.h> #include <asm/types.h> #include <asm/ipc.h> diff --git a/arch/um/kernel/exec_kern.c b/arch/um/kernel/exec_kern.c index eaae628fa902..a6be6b542b4a 100644 --- a/arch/um/kernel/exec_kern.c +++ b/arch/um/kernel/exec_kern.c @@ -5,6 +5,7 @@ #include "linux/slab.h" #include "linux/smp_lock.h" +#include "linux/ptrace.h" #include "asm/ptrace.h" #include "asm/pgtable.h" #include "asm/tlbflush.h" diff --git a/arch/um/kernel/signal_kern.c b/arch/um/kernel/signal_kern.c index cc9ab3416c9a..6e13847edb75 100644 --- a/arch/um/kernel/signal_kern.c +++ b/arch/um/kernel/signal_kern.c @@ -14,6 +14,7 @@ #include "linux/slab.h" #include "linux/tty.h" #include "linux/binfmts.h" +#include "linux/ptrace.h" #include "asm/signal.h" #include "asm/uaccess.h" #include "asm/unistd.h" diff --git a/arch/um/kernel/skas/process_kern.c b/arch/um/kernel/skas/process_kern.c index 01ccfb478ebd..e0ea56be1dae 100644 --- a/arch/um/kernel/skas/process_kern.c +++ b/arch/um/kernel/skas/process_kern.c @@ -5,6 +5,7 @@ #include "linux/sched.h" #include "linux/slab.h" +#include "linux/ptrace.h" #include "kern_util.h" #include "time_user.h" #include "signal_user.h" diff --git a/arch/um/kernel/tt/process_kern.c b/arch/um/kernel/tt/process_kern.c index 6e8bb62bf77b..b4a855f44adc 100644 --- a/arch/um/kernel/tt/process_kern.c +++ b/arch/um/kernel/tt/process_kern.c @@ -7,6 +7,7 @@ #include "linux/signal.h" #include "linux/kernel.h" #include "linux/interrupt.h" +#include "linux/ptrace.h" #include "asm/system.h" #include "asm/pgalloc.h" #include "asm/ptrace.h" diff --git a/arch/um/kernel/tt/syscall_kern.c b/arch/um/kernel/tt/syscall_kern.c index 7401449b1a2e..1b71f9ce5184 100644 --- a/arch/um/kernel/tt/syscall_kern.c +++ b/arch/um/kernel/tt/syscall_kern.c @@ -6,6 +6,7 @@ #include "linux/types.h" #include "linux/utime.h" #include "linux/sys.h" +#include "linux/ptrace.h" #include "asm/unistd.h" #include "asm/ptrace.h" #include "asm/uaccess.h" diff --git a/arch/v850/kernel/asm-consts.c b/arch/v850/kernel/asm-consts.c index 44e042344612..666930d9cea6 100644 --- a/arch/v850/kernel/asm-consts.c +++ b/arch/v850/kernel/asm-consts.c @@ -11,6 +11,7 @@ #include <linux/stddef.h> #include <linux/sched.h> #include <linux/kernel_stat.h> +#include <linux/ptrace.h> #include <asm/irq.h> #include <asm/hardirq.h> #include <asm/errno.h> diff --git a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c index 3849c0ad3ec0..a7d36b41c593 100644 --- a/arch/x86_64/ia32/sys_ia32.c +++ b/arch/x86_64/ia32/sys_ia32.c @@ -59,6 +59,7 @@ #include <linux/aio_abi.h> #include <linux/compat.h> #include <linux/vfs.h> +#include <linux/ptrace.h> #include <asm/mman.h> #include <asm/types.h> #include <asm/uaccess.h> diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index a369757dc78c..91d24995dfcf 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c @@ -24,6 +24,7 @@ #include <linux/binfmts.h> #include <linux/personality.h> #include <linux/init.h> +#include <linux/ptrace.h> #include <asm/system.h> #include <asm/uaccess.h> diff --git a/fs/proc/base.c b/fs/proc/base.c index 164fb87ea678..cfb54c010ef9 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -31,6 +31,7 @@ #include <linux/kallsyms.h> #include <linux/mount.h> #include <linux/security.h> +#include <linux/ptrace.h> /* * For hysterical raisins we keep the same inumbers as in the old procfs. diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 706b420fb5c9..5d44a953f423 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -3,8 +3,6 @@ /* ptrace.h */ /* structs and defines to help the user use the ptrace system call. */ -#include <linux/compiler.h> - /* has the defines to get at the registers. */ #define PTRACE_TRACEME 0 @@ -38,6 +36,8 @@ #define PTRACE_O_TRACEVFORKDONE 0x00000020 #define PTRACE_O_TRACEEXIT 0x00000040 +#define PTRACE_O_MASK 0x0000007f + /* Wait extended result codes for the above trace options. */ #define PTRACE_EVENT_FORK 1 #define PTRACE_EVENT_VFORK 2 @@ -47,7 +47,27 @@ #define PTRACE_EVENT_EXIT 6 #include <asm/ptrace.h> -#include <linux/sched.h> + +#ifdef __KERNEL__ +/* + * Ptrace flags + */ + +#define PT_PTRACED 0x00000001 +#define PT_DTRACE 0x00000002 /* delayed trace (used on m68k, i386) */ +#define PT_TRACESYSGOOD 0x00000004 +#define PT_PTRACE_CAP 0x00000008 /* ptracer can follow suid-exec */ +#define PT_TRACE_FORK 0x00000010 +#define PT_TRACE_VFORK 0x00000020 +#define PT_TRACE_CLONE 0x00000040 +#define PT_TRACE_EXEC 0x00000080 +#define PT_TRACE_VFORK_DONE 0x00000100 +#define PT_TRACE_EXIT 0x00000200 + +#define PT_TRACE_MASK 0x000003f4 + +#include <linux/compiler.h> /* For unlikely. */ +#include <linux/sched.h> /* For struct task_struct. */ extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char *dst, int len); extern int ptrace_writedata(struct task_struct *tsk, char * src, unsigned long dst, int len); @@ -58,11 +78,11 @@ extern int ptrace_check_attach(struct task_struct *task, int kill); extern int ptrace_request(struct task_struct *child, long request, long addr, long data); extern void ptrace_notify(int exit_code); extern void __ptrace_link(struct task_struct *child, - struct task_struct *new_parent); + struct task_struct *new_parent); extern void __ptrace_unlink(struct task_struct *child); static inline void ptrace_link(struct task_struct *child, - struct task_struct *new_parent) + struct task_struct *new_parent) { if (unlikely(child->ptrace)) __ptrace_link(child, new_parent); @@ -72,5 +92,6 @@ static inline void ptrace_unlink(struct task_struct *child) if (unlikely(child->ptrace)) __ptrace_unlink(child); } +#endif #endif diff --git a/include/linux/sched.h b/include/linux/sched.h index d3cd5e31e8f9..cfa6fd4d86da 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -446,21 +446,6 @@ do { if (atomic_dec_and_test(&(tsk)->usage)) __put_task_struct(tsk); } while(0) #define PF_FSTRANS 0x00020000 /* inside a filesystem transaction */ #define PF_KSWAPD 0x00040000 /* I am kswapd */ -/* - * Ptrace flags - */ - -#define PT_PTRACED 0x00000001 -#define PT_DTRACE 0x00000002 /* delayed trace (used on m68k, i386) */ -#define PT_TRACESYSGOOD 0x00000004 -#define PT_PTRACE_CAP 0x00000008 /* ptracer can follow suid-exec */ -#define PT_TRACE_FORK 0x00000010 -#define PT_TRACE_VFORK 0x00000020 -#define PT_TRACE_CLONE 0x00000040 -#define PT_TRACE_EXEC 0x00000080 -#define PT_TRACE_VFORK_DONE 0x00000100 -#define PT_TRACE_EXIT 0x00000200 - #if CONFIG_SMP extern void set_cpus_allowed(task_t *p, unsigned long new_mask); #else diff --git a/kernel/exit.c b/kernel/exit.c index 0523eb305c17..d2d7c72f1e81 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -694,10 +694,8 @@ static void exit_notify(struct task_struct *tsk) * only has special meaning to our real parent. */ if (tsk->exit_signal != -1) { - if (tsk->parent == tsk->real_parent) - do_notify_parent(tsk, tsk->exit_signal); - else - do_notify_parent(tsk, SIGCHLD); + int signal = tsk->parent == tsk->real_parent ? tsk->exit_signal : SIGCHLD; + do_notify_parent(tsk, signal); } tsk->state = TASK_ZOMBIE; @@ -731,8 +729,10 @@ NORET_TYPE void do_exit(long code) profile_exit_task(tsk); - if (unlikely(current->ptrace & PT_TRACE_EXIT)) + if (unlikely(current->ptrace & PT_TRACE_EXIT)) { + current->ptrace_message = code; ptrace_notify((PTRACE_EVENT_EXIT << 8) | SIGTRAP); + } acct_process(code); __exit_mm(tsk); diff --git a/kernel/ptrace.c b/kernel/ptrace.c index f67675f3d9d3..287b81b65c34 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -252,49 +252,30 @@ int ptrace_writedata(struct task_struct *tsk, char * src, unsigned long dst, int static int ptrace_setoptions(struct task_struct *child, long data) { + child->ptrace &= ~PT_TRACE_MASK; + if (data & PTRACE_O_TRACESYSGOOD) child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; if (data & PTRACE_O_TRACEFORK) child->ptrace |= PT_TRACE_FORK; - else - child->ptrace &= ~PT_TRACE_FORK; if (data & PTRACE_O_TRACEVFORK) child->ptrace |= PT_TRACE_VFORK; - else - child->ptrace &= ~PT_TRACE_VFORK; if (data & PTRACE_O_TRACECLONE) child->ptrace |= PT_TRACE_CLONE; - else - child->ptrace &= ~PT_TRACE_CLONE; if (data & PTRACE_O_TRACEEXEC) child->ptrace |= PT_TRACE_EXEC; - else - child->ptrace &= ~PT_TRACE_EXEC; if (data & PTRACE_O_TRACEVFORKDONE) child->ptrace |= PT_TRACE_VFORK_DONE; - else - child->ptrace &= ~PT_TRACE_VFORK_DONE; if (data & PTRACE_O_TRACEEXIT) child->ptrace |= PT_TRACE_EXIT; - else - child->ptrace &= ~PT_TRACE_EXIT; - - if ((data & (PTRACE_O_TRACESYSGOOD | PTRACE_O_TRACEFORK - | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE - | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEEXIT - | PTRACE_O_TRACEVFORKDONE)) - != data) - return -EINVAL; - return 0; + return (data & ~PTRACE_O_MASK) ? -EINVAL : 0; } static int ptrace_getsiginfo(struct task_struct *child, long data) diff --git a/kernel/signal.c b/kernel/signal.c index d0d09cfbe863..b8fc6a05c031 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -19,6 +19,7 @@ #include <linux/tty.h> #include <linux/binfmts.h> #include <linux/security.h> +#include <linux/ptrace.h> #include <asm/param.h> #include <asm/uaccess.h> #include <asm/siginfo.h> diff --git a/security/capability.c b/security/capability.c index 5909732acdfc..09882ecc997d 100644 --- a/security/capability.c +++ b/security/capability.c @@ -18,6 +18,7 @@ #include <linux/smp_lock.h> #include <linux/skbuff.h> #include <linux/netlink.h> +#include <linux/ptrace.h> int cap_capable (struct task_struct *tsk, int cap) { |
