lkml.org 
[lkml]   [2007]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 09/13] syslets: x86, mark async unsafe syscalls
    From: Ingo Molnar <mingo@elte.hu>

    mark clone() and fork() as not available for async execution.
    Both need an intact user context beneath them to work.

    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
    ---
    arch/i386/kernel/ioport.c | 6 ++++++
    arch/i386/kernel/ldt.c | 3 +++
    arch/i386/kernel/process.c | 6 ++++++
    arch/i386/kernel/vm86.c | 6 ++++++
    4 files changed, 21 insertions(+)

    Index: linux/arch/i386/kernel/ioport.c
    ===================================================================
    --- linux.orig/arch/i386/kernel/ioport.c
    +++ linux/arch/i386/kernel/ioport.c
    @@ -62,6 +62,9 @@ asmlinkage long sys_ioperm(unsigned long
    struct tss_struct * tss;
    unsigned long *bitmap;

    + if (async_syscall(current))
    + return -ENOSYS;
    +
    if ((from + num <= from) || (from + num > IO_BITMAP_BITS))
    return -EINVAL;
    if (turn_on && !capable(CAP_SYS_RAWIO))
    @@ -139,6 +142,9 @@ asmlinkage long sys_iopl(unsigned long u
    unsigned int old = (regs->eflags >> 12) & 3;
    struct thread_struct *t = &current->thread;

    + if (async_syscall(current))
    + return -ENOSYS;
    +
    if (level > 3)
    return -EINVAL;
    /* Trying to gain more privileges? */
    Index: linux/arch/i386/kernel/ldt.c
    ===================================================================
    --- linux.orig/arch/i386/kernel/ldt.c
    +++ linux/arch/i386/kernel/ldt.c
    @@ -233,6 +233,9 @@ asmlinkage int sys_modify_ldt(int func,
    {
    int ret = -ENOSYS;

    + if (async_syscall(current))
    + return -ENOSYS;
    +
    switch (func) {
    case 0:
    ret = read_ldt(ptr, bytecount);
    Index: linux/arch/i386/kernel/process.c
    ===================================================================
    --- linux.orig/arch/i386/kernel/process.c
    +++ linux/arch/i386/kernel/process.c
    @@ -731,6 +731,9 @@ struct task_struct fastcall * __switch_t

    asmlinkage int sys_fork(struct pt_regs regs)
    {
    + if (async_syscall(current))
    + return -ENOSYS;
    +
    return do_fork(SIGCHLD, regs.esp, &regs, 0, NULL, NULL);
    }

    @@ -740,6 +743,9 @@ asmlinkage int sys_clone(struct pt_regs
    unsigned long newsp;
    int __user *parent_tidptr, *child_tidptr;

    + if (async_syscall(current))
    + return -ENOSYS;
    +
    clone_flags = regs.ebx;
    newsp = regs.ecx;
    parent_tidptr = (int __user *)regs.edx;
    Index: linux/arch/i386/kernel/vm86.c
    ===================================================================
    --- linux.orig/arch/i386/kernel/vm86.c
    +++ linux/arch/i386/kernel/vm86.c
    @@ -208,6 +208,9 @@ asmlinkage int sys_vm86old(struct pt_reg
    struct task_struct *tsk;
    int tmp, ret = -EPERM;

    + if (async_syscall(current))
    + return -ENOSYS;
    +
    tsk = current;
    if (tsk->thread.saved_esp0)
    goto out;
    @@ -238,6 +241,9 @@ asmlinkage int sys_vm86(struct pt_regs r
    int tmp, ret;
    struct vm86plus_struct __user *v86;

    + if (async_syscall(current))
    + return -ENOSYS;
    +
    tsk = current;
    switch (regs.ebx) {
    case VM86_REQUEST_IRQ:
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-02-21 22:27    [W:0.025 / U:0.544 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site