• Eric Dumazet's avatar
    tcp: add sanity checks to rx zerocopy · 577e4432
    Eric Dumazet authored
    TCP rx zerocopy intent is to map pages initially allocated
    from NIC drivers, not pages owned by a fs.
    
    This patch adds to can_map_frag() these additional checks:
    
    - Page must not be a compound one.
    - page->mapping must be NULL.
    
    This fixes the panic reported by ZhangPeng.
    
    syzbot was able to loopback packets built with sendfile(),
    mapping pages owned by an ext4 file to TCP rx zerocopy.
    
    r3 = socket$inet_tcp(0x2, 0x1, 0x0)
    mmap(&(0x7f0000ff9000/0x4000)=nil, 0x4000, 0x0, 0x12, r3, 0x0)
    r4 = socket$inet_tcp(0x2, 0x1, 0x0)
    bind$inet(r4, &(0x7f0000000000)={0x2, 0x4e24, @multicast1}, 0x10)
    connect$inet(r4, &(0x7f00000006c0)={0x2, 0x4e24, @empty}, 0x10)
    r5 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
        0x181e42, 0x0)
    fallocate(r5, 0x0, 0x0, 0x85b8)
    sendfile(r4, r5, 0x0, 0x8ba0)
    getsockopt$inet_tcp_TCP_ZEROCOPY_RECEIVE(r4, 0x6, 0x23,
        &(0x7f00000001c0)={&(0x7f0000ffb000/0x3000)=nil, 0x3000, 0x0, 0x0, 0x0,
        0x0, 0x0, 0x0, 0x0}, &(0x7f0000000440)=0x40)
    r6 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
        0x181e42, 0x0)
    
    Fixes: 93ab6cc6 ("tcp: implement mmap() for zero copy receive")
    Link: https://lore.kernel.org/netdev/5106a58e-04da-372a-b836-9d3d0bd2507b@huawei.com/T/Reported-and-bisected-by: default avatarZhangPeng <zhangpeng362@huawei.com>
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Arjun Roy <arjunroy@google.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: linux-mm@vger.kernel.org
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: linux-fsdevel@vger.kernel.org
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    577e4432
tcp.c 130 KB