• X
    sctp: use memdup_user instead of vmemdup_user · 5dc16ac5
    Xin Long 提交于
    commit ef82bcfa671b9a635bab5fa669005663d8b177c5 upstream.
    
    In sctp_setsockopt_bindx()/__sctp_setsockopt_connectx(), it allocates
    memory with addrs_size which is passed from userspace. We used flag
    GFP_USER to put some more restrictions on it in Commit cacc0621
    ("sctp: use GFP_USER for user-controlled kmalloc").
    
    However, since Commit c981f254 ("sctp: use vmemdup_user() rather
    than badly open-coding memdup_user()"), vmemdup_user() has been used,
    which doesn't check GFP_USER flag when goes to vmalloc_*(). So when
    addrs_size is a huge value, it could exhaust memory and even trigger
    oom killer.
    
    This patch is to use memdup_user() instead, in which GFP_USER would
    work to limit the memory allocation with a huge addrs_size.
    
    Note we can't fix it by limiting 'addrs_size', as there's no demand
    for it from RFC.
    
    Reported-by: syzbot+ec1b7575afef85a0e5ca@syzkaller.appspotmail.com
    Fixes: c981f254 ("sctp: use vmemdup_user() rather than badly open-coding memdup_user()")
    Signed-off-by: NXin Long <lucien.xin@gmail.com>
    Acked-by: NNeil Horman <nhorman@tuxdriver.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    Signed-off-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
    5dc16ac5
socket.c 247.1 KB