Re: [git pull] uaccess-related bits of vfs.git

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, May 13, 2017 at 07:04:13PM +0100, Al Viro wrote:

> My point is, this stuff needs looking at.  Even this quick look in arch/x86
> has shown several fairly different classes of that stuff, probably needing
> different approaches.  And that - on an architecture that had tons of TLC
> around signal delivery; I'm not saying that result is optimal (asm-goto sounds
> potentially useful there), but it had a lot of attention given to it...

BTW, even in arch/* they tend to nest.  E.g. arch/alpha has 133 callers
total.  Distribution by files:
     35 arch/alpha/kernel/osf_sys.c
     92 arch/alpha/kernel/signal.c
      1 arch/alpha/kernel/traps.c
      4 arch/alpha/lib/csum_partial_copy.c
      1 arch/alpha/mm/fault.c
Distribution by functions:
      1 osf_getdomainname()	[1]
      2 osf_sigstack()
      2 get_tv32()
      2 put_tv32()
      4 get_it32()
      4 put_it32()
      2 osf_select()
     18 osf_wait4()		[2]
      6 osf_sigaction()
     34 restore_sigcontext()
      1 do_sigreturn()
     42 setup_sigcontext()
      3 setup_frame()
      6 setup_rt_frame()
      1 dik_show_code()		[3]
      2 csum_partial_cfu_aligned()
      2 csum_partial_cfu_src_aligned()
      1 do_page_fault()		[4]

[1] insane, BTW - should be strnlen() + copy_to_user(); should report -EFAULT
on failure, while we are at it.
[2] with fairly disgusting use of set_fs() in the mix.
[3] would break with get_user() - it's oopser fetching code to printk.
[4] this:
        /* As of EV6, a load into $31/$f31 is a prefetch, and never faults
           (or is suppressed by the PALcode).  Support that for older CPUs
           by ignoring such an instruction.  */
        if (cause == 0) {
                unsigned int insn;
                __get_user(insn, (unsigned int __user *)regs->pc);
                if ((insn >> 21 & 0x1f) == 0x1f &&
                    /* ldq ldl ldt lds ldg ldf ldwu ldbu */
                    (1ul << (insn >> 26) & 0x30f00001400ul)) {
                        regs->pc += 4;
                        return;
                }
        }



[Index of Archives]     [Linux Kernel]     [Kernel Newbies]     [x86 Platform Driver]     [Netdev]     [Linux Wireless]     [Netfilter]     [Bugtraq]     [Linux Filesystems]     [Yosemite Discussion]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]

  Powered by Linux