• Jiri Pirko's avatar
    net: sched: fix use after free when tcf_chain_destroy is called multiple times · 744a4cf6
    Jiri Pirko authored
    The goto_chain termination action takes a reference of a chain. In that
    case, there is an issue when block_put is called tcf_chain_destroy
    directly. The follo-up call of tcf_chain_put by goto_chain action free
    works with memory that is already freed. This was caught by kasan:
    
    [  220.337908] BUG: KASAN: use-after-free in tcf_chain_put+0x1b/0x50
    [  220.344103] Read of size 4 at addr ffff88036d1f2cec by task systemd-journal/261
    [  220.353047] CPU: 0 PID: 261 Comm: systemd-journal Not tainted 4.13.0-rc5jiri+ #54
    [  220.360661] Hardware name: Mellanox Technologies Ltd. Mellanox switch/Mellanox x86 mezzanine board, BIOS 4.6.5 08/02/2016
    [  220.371784] Call Trace:
    [  220.374290]  <IRQ>
    [  220.376355]  dump_stack+0xd5/0x150
    [  220.391485]  print_address_description+0x86/0x410
    [  220.396308]  kasan_report+0x181/0x4c0
    [  220.415211]  tcf_chain_put+0x1b/0x50
    [  220.418949]  free_tcf+0x95/0xc0
    
    So allow tcf_chain_destroy to be called multiple times, free only in
    case the reference count drops to 0.
    
    Fixes: 5bc17018 ("net: sched: introduce multichain support for filters")
    Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    744a4cf6
cls_api.c 22.8 KB