Star64_linux/drivers/net
Wang Yufen 17a34541da net: tun: Fix memory leaks of napi_get_frags
[ Upstream commit 1118b2049d ]

kmemleak reports after running test_progs:

unreferenced object 0xffff8881b1672dc0 (size 232):
  comm "test_progs", pid 394388, jiffies 4354712116 (age 841.975s)
  hex dump (first 32 bytes):
    e0 84 d7 a8 81 88 ff ff 80 2c 67 b1 81 88 ff ff  .........,g.....
    00 40 c5 9b 81 88 ff ff 00 00 00 00 00 00 00 00  .@..............
  backtrace:
    [<00000000c8f01748>] napi_skb_cache_get+0xd4/0x150
    [<0000000041c7fc09>] __napi_build_skb+0x15/0x50
    [<00000000431c7079>] __napi_alloc_skb+0x26e/0x540
    [<000000003ecfa30e>] napi_get_frags+0x59/0x140
    [<0000000099b2199e>] tun_get_user+0x183d/0x3bb0 [tun]
    [<000000008a5adef0>] tun_chr_write_iter+0xc0/0x1b1 [tun]
    [<0000000049993ff4>] do_iter_readv_writev+0x19f/0x320
    [<000000008f338ea2>] do_iter_write+0x135/0x630
    [<000000008a3377a4>] vfs_writev+0x12e/0x440
    [<00000000a6b5639a>] do_writev+0x104/0x280
    [<00000000ccf065d8>] do_syscall_64+0x3b/0x90
    [<00000000d776e329>] entry_SYSCALL_64_after_hwframe+0x63/0xcd

The issue occurs in the following scenarios:
tun_get_user()
  napi_gro_frags()
    napi_frags_finish()
      case GRO_NORMAL:
        gro_normal_one()
          list_add_tail(&skb->list, &napi->rx_list);
          <-- While napi->rx_count < READ_ONCE(gro_normal_batch),
          <-- gro_normal_list() is not called, napi->rx_list is not empty
  <-- not ask to complete the gro work, will cause memory leaks in
  <-- following tun_napi_del()
...
tun_napi_del()
  netif_napi_del()
    __netif_napi_del()
    <-- &napi->rx_list is not empty, which caused memory leaks

To fix, add napi_complete() after napi_gro_frags().

Fixes: 90e33d4594 ("tun: enable napi_gro_frags() for TUN/TAP driver")
Signed-off-by: Wang Yufen <wangyufen@huawei.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-04-19 17:56:08 +08:00
..
appletalk
arcnet
bonding
caif
can can: rcar_canfd: rcar_canfd_handle_global_receive(): fix IRQ storm on global FIFO receive 2023-04-19 17:55:54 +08:00
dsa net: dsa: Fix possible memory leaks in dsa_loop_init() 2023-04-19 17:55:56 +08:00
ethernet octeontx2-pf: NIX TX overwrites SQ_CTX_HW_S[SQ_INT] 2023-04-19 17:56:08 +08:00
fddi
fjes
hamradio
hippi
hyperv
ieee802154
ipa
ipvlan
mctp
mdio
netdevsim netdevsim: remove dir in nsim_dev_debugfs_init() when creating ports dir failed 2023-04-19 17:55:53 +08:00
pcs
phy net: mdio: fix undefined behavior in bit shift for __mdiobus_register 2023-04-19 17:55:59 +08:00
plip
ppp
slip
team
usb
vmxnet3
wan
wireguard
wireless wifi: brcmfmac: Fix potential buffer overflow in brcmf_fweh_event_worker() 2023-04-19 17:56:06 +08:00
wwan
xen-netback
bareudp.c
dummy.c
eql.c
geneve.c
gtp.c
ifb.c
Kconfig
LICENSE.SRC
loopback.c
macsec.c macsec: clear encryption keys from the stack after setting up offload 2023-04-19 17:56:08 +08:00
macvlan.c
macvtap.c
Makefile
mdio.c
mhi_net.c
mii.c
net_failover.c
netconsole.c
nlmon.c
ntb_netdev.c
rionet.c
sb1000.c
Space.c
sungem_phy.c
tap.c
thunderbolt.c
tun.c net: tun: Fix memory leaks of napi_get_frags 2023-04-19 17:56:08 +08:00
veth.c
virtio_net.c
vrf.c
vsockmon.c
vxlan.c
xen-netfront.c