• Vlad Buslov's avatar
    net: sched: null actions array pointer before releasing action · c10bbfae
    Vlad Buslov authored
    Currently, tcf_action_delete() nulls actions array pointer after putting
    and deleting it. However, if tcf_idr_delete_index() returns an error,
    pointer to action is not set to null. That results it being released second
    time in error handling code of tca_action_gd().
    
    Kasan error:
    
    [  807.367755] ==================================================================
    [  807.375844] BUG: KASAN: use-after-free in tc_setup_cb_call+0x14e/0x250
    [  807.382763] Read of size 8 at addr ffff88033e636000 by task tc/2732
    
    [  807.391289] CPU: 0 PID: 2732 Comm: tc Tainted: G        W         4.19.0-rc1+ #799
    [  807.399542] Hardware name: Supermicro SYS-2028TP-DECR/X10DRT-P, BIOS 2.0b 03/30/2017
    [  807.407948] Call Trace:
    [  807.410763]  dump_stack+0x92/0xeb
    [  807.414456]  print_address_description+0x70/0x360
    [  807.419549]  kasan_report+0x14d/0x300
    [  807.423582]  ? tc_setup_cb_call+0x14e/0x250
    [  807.428150]  tc_setup_cb_call+0x14e/0x250
    [  807.432539]  ? nla_put+0x65/0xe0
    [  807.436146]  fl_dump+0x394/0x3f0 [cls_flower]
    [  807.440890]  ? fl_tmplt_dump+0x140/0x140 [cls_flower]
    [  807.446327]  ? lock_downgrade+0x320/0x320
    [  807.450702]  ? lock_acquire+0xe2/0x220
    [  807.454819]  ? is_bpf_text_address+0x5/0x140
    [  807.459475]  ? memcpy+0x34/0x50
    [  807.462980]  ? nla_put+0x65/0xe0
    [  807.466582]  tcf_fill_node+0x341/0x430
    [  807.470717]  ? tcf_block_put+0xe0/0xe0
    [  807.474859]  tcf_node_dump+0xdb/0xf0
    [  807.478821]  fl_walk+0x8e/0x170 [cls_flower]
    [  807.483474]  tcf_chain_dump+0x35a/0x4d0
    [  807.487703]  ? tfilter_notify+0x170/0x170
    [  807.492091]  ? tcf_fill_node+0x430/0x430
    [  807.496411]  tc_dump_tfilter+0x362/0x3f0
    [  807.500712]  ? tc_del_tfilter+0x850/0x850
    [  807.505104]  ? kasan_unpoison_shadow+0x30/0x40
    [  807.509940]  ? __mutex_unlock_slowpath+0xcf/0x410
    [  807.515031]  netlink_dump+0x263/0x4f0
    [  807.519077]  __netlink_dump_start+0x2a0/0x300
    [  807.523817]  ? tc_del_tfilter+0x850/0x850
    [  807.528198]  rtnetlink_rcv_msg+0x46a/0x6d0
    [  807.532671]  ? rtnl_fdb_del+0x3f0/0x3f0
    [  807.536878]  ? tc_del_tfilter+0x850/0x850
    [  807.541280]  netlink_rcv_skb+0x18d/0x200
    [  807.545570]  ? rtnl_fdb_del+0x3f0/0x3f0
    [  807.549773]  ? netlink_ack+0x500/0x500
    [  807.553913]  netlink_unicast+0x2d0/0x370
    [  807.558212]  ? netlink_attachskb+0x340/0x340
    [  807.562855]  ? _copy_from_iter_full+0xe9/0x3e0
    [  807.567677]  ? import_iovec+0x11e/0x1c0
    [  807.571890]  netlink_sendmsg+0x3b9/0x6a0
    [  807.576192]  ? netlink_unicast+0x370/0x370
    [  807.580684]  ? netlink_unicast+0x370/0x370
    [  807.585154]  sock_sendmsg+0x6b/0x80
    [  807.589015]  ___sys_sendmsg+0x4a1/0x520
    [  807.593230]  ? copy_msghdr_from_user+0x210/0x210
    [  807.598232]  ? do_wp_page+0x174/0x880
    [  807.602276]  ? __handle_mm_fault+0x749/0x1c10
    [  807.607021]  ? __handle_mm_fault+0x1046/0x1c10
    [  807.611849]  ? __pmd_alloc+0x320/0x320
    [  807.615973]  ? check_chain_key+0x140/0x1f0
    [  807.620450]  ? check_chain_key+0x140/0x1f0
    [  807.624929]  ? __fget_light+0xbc/0xd0
    [  807.628970]  ? __sys_sendmsg+0xd7/0x150
    [  807.633172]  __sys_sendmsg+0xd7/0x150
    [  807.637201]  ? __ia32_sys_shutdown+0x30/0x30
    [  807.641846]  ? up_read+0x53/0x90
    [  807.645442]  ? __do_page_fault+0x484/0x780
    [  807.649949]  ? do_syscall_64+0x1e/0x2c0
    [  807.654164]  do_syscall_64+0x72/0x2c0
    [  807.658198]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
    [  807.663625] RIP: 0033:0x7f42e9870150
    [  807.667568] Code: 8b 15 3c 7d 2b 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb cd 66 0f 1f 44 00 00 83 3d b9 d5 2b 00 00 75 10 b8 2e 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 be cd 00 00 48 89 04 24
    [  807.687328] RSP: 002b:00007ffdbf595b58 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    [  807.695564] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f42e9870150
    [  807.703083] RDX: 0000000000000000 RSI: 00007ffdbf595b80 RDI: 0000000000000003
    [  807.710605] RBP: 00007ffdbf599d90 R08: 0000000000679bc0 R09: 000000000000000f
    [  807.718127] R10: 00000000000005e7 R11: 0000000000000246 R12: 00007ffdbf599d88
    [  807.725651] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
    
    [  807.735048] Allocated by task 2687:
    [  807.738902]  kasan_kmalloc+0xa0/0xd0
    [  807.742852]  __kmalloc+0x118/0x2d0
    [  807.746615]  tcf_idr_create+0x44/0x320
    [  807.750738]  tcf_nat_init+0x41e/0x530 [act_nat]
    [  807.755638]  tcf_action_init_1+0x4e0/0x650
    [  807.760104]  tcf_action_init+0x1ce/0x2d0
    [  807.764395]  tcf_exts_validate+0x1d8/0x200
    [  807.768861]  fl_change+0x55a/0x26b4 [cls_flower]
    [  807.773845]  tc_new_tfilter+0x748/0xa20
    [  807.778051]  rtnetlink_rcv_msg+0x56a/0x6d0
    [  807.782517]  netlink_rcv_skb+0x18d/0x200
    [  807.786804]  netlink_unicast+0x2d0/0x370
    [  807.791095]  netlink_sendmsg+0x3b9/0x6a0
    [  807.795387]  sock_sendmsg+0x6b/0x80
    [  807.799240]  ___sys_sendmsg+0x4a1/0x520
    [  807.803445]  __sys_sendmsg+0xd7/0x150
    [  807.807473]  do_syscall_64+0x72/0x2c0
    [  807.811506]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
    
    [  807.818776] Freed by task 2728:
    [  807.822283]  __kasan_slab_free+0x122/0x180
    [  807.826752]  kfree+0xf4/0x2f0
    [  807.830080]  __tcf_action_put+0x5a/0xb0
    [  807.834281]  tcf_action_put_many+0x46/0x70
    [  807.838747]  tca_action_gd+0x232/0xc40
    [  807.842862]  tc_ctl_action+0x215/0x230
    [  807.846977]  rtnetlink_rcv_msg+0x56a/0x6d0
    [  807.851444]  netlink_rcv_skb+0x18d/0x200
    [  807.855731]  netlink_unicast+0x2d0/0x370
    [  807.860021]  netlink_sendmsg+0x3b9/0x6a0
    [  807.864312]  sock_sendmsg+0x6b/0x80
    [  807.868166]  ___sys_sendmsg+0x4a1/0x520
    [  807.872372]  __sys_sendmsg+0xd7/0x150
    [  807.876401]  do_syscall_64+0x72/0x2c0
    [  807.880431]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
    
    [  807.887704] The buggy address belongs to the object at ffff88033e636000
                    which belongs to the cache kmalloc-256 of size 256
    [  807.900909] The buggy address is located 0 bytes inside of
                    256-byte region [ffff88033e636000, ffff88033e636100)
    [  807.913155] The buggy address belongs to the page:
    [  807.918322] page:ffffea000cf98d80 count:1 mapcount:0 mapping:ffff88036f80ee00 index:0x0 compound_mapcount: 0
    [  807.928831] flags: 0x5fff8000008100(slab|head)
    [  807.933647] raw: 005fff8000008100 ffffea000db44f00 0000000400000004 ffff88036f80ee00
    [  807.942050] raw: 0000000000000000 0000000080190019 00000001ffffffff 0000000000000000
    [  807.950456] page dumped because: kasan: bad access detected
    
    [  807.958240] Memory state around the buggy address:
    [  807.963405]  ffff88033e635f00: fc fc fc fc fb fb fb fb fb fb fb fc fc fc fc fb
    [  807.971288]  ffff88033e635f80: fb fb fb fb fb fb fc fc fc fc fc fc fc fc fc fc
    [  807.979166] >ffff88033e636000: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  807.994882]                    ^
    [  807.998477]  ffff88033e636080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  808.006352]  ffff88033e636100: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
    [  808.014230] ==================================================================
    [  808.022108] Disabling lock debugging due to kernel taint
    
    Fixes: edfaf94f ("net_sched: improve and refactor tcf_action_put_many()")
    Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
    Acked-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c10bbfae
act_api.c 40.2 KB