• Josh Elsasser's avatar
    net: check before dereferencing netdev_ops during busy poll · f9955d5e
    Josh Elsasser authored
    BugLink: https://bugs.launchpad.net/bugs/1836668
    
    init_dummy_netdev() leaves its netdev_ops pointer zeroed. This leads
    to a NULL pointer dereference when sk_busy_loop fires against an iwlwifi
    wireless adapter and checks napi->dev->netdev_ops->ndo_busy_poll.
    
    Avoid this by ensuring napi->dev->netdev_ops is valid before following
    the pointer, avoiding the following panic when busy polling on a dummy
    netdev:
    
      BUG: unable to handle kernel NULL pointer dereference at 00000000000000c8
      IP: [<ffffffff817b4b72>] sk_busy_loop+0x92/0x2f0
      Call Trace:
       [<ffffffff815a3134>] ? uart_write_room+0x74/0xf0
       [<ffffffff817964a9>] sock_poll+0x99/0xa0
       [<ffffffff81223142>] do_sys_poll+0x2e2/0x520
       [<ffffffff8118d3fc>] ? get_page_from_freelist+0x3bc/0xa30
       [<ffffffff810ada22>] ? update_curr+0x62/0x140
       [<ffffffff811ea671>] ? __slab_free+0xa1/0x2a0
       [<ffffffff811ea671>] ? __slab_free+0xa1/0x2a0
       [<ffffffff8179dbb1>] ? skb_free_head+0x21/0x30
       [<ffffffff81221bd0>] ? poll_initwait+0x50/0x50
       [<ffffffff811eaa36>] ? kmem_cache_free+0x1c6/0x1e0
       [<ffffffff815a4884>] ? uart_write+0x124/0x1d0
       [<ffffffff810bd1cd>] ? remove_wait_queue+0x4d/0x60
       [<ffffffff810bd224>] ? __wake_up+0x44/0x50
       [<ffffffff81582731>] ? tty_write_unlock+0x31/0x40
       [<ffffffff8158c5c6>] ? tty_ldisc_deref+0x16/0x20
       [<ffffffff81584820>] ? tty_write+0x1e0/0x2f0
       [<ffffffff81587e50>] ? process_echoes+0x80/0x80
       [<ffffffff8120c17b>] ? __vfs_write+0x2b/0x130
       [<ffffffff8120d09a>] ? vfs_write+0x15a/0x1a0
       [<ffffffff81223455>] SyS_poll+0x75/0x100
       [<ffffffff819a6524>] entry_SYSCALL_64_fastpath+0x24/0xcf
    
    Commit 79e7fff4 ("net: remove support for per driver ndo_busy_poll()")
    indirectly fixed this upstream in linux-4.11 by removing the offending
    pointer usage. No other users of napi->dev touch its netdev_ops.
    
    Fixes: 8b80cda5 ("net: rename include/net/ll_poll.h to include/net/busy_poll.h") # 4.4.y
    Signed-off-by: default avatarJosh Elsasser <jelsasser@appneta.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
    Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
    f9955d5e
busy_poll.h 3.98 KB