• Vladislav Efanov's avatar
    batman-adv: Broken sync while rescheduling delayed work · abac3ac9
    Vladislav Efanov authored
    Syzkaller got a lot of crashes like:
    KASAN: use-after-free Write in *_timers*
    
    All of these crashes point to the same memory area:
    
    The buggy address belongs to the object at ffff88801f870000
     which belongs to the cache kmalloc-8k of size 8192
    The buggy address is located 5320 bytes inside of
     8192-byte region [ffff88801f870000, ffff88801f872000)
    
    This area belongs to :
            batadv_priv->batadv_priv_dat->delayed_work->timer_list
    
    The reason for these issues is the lack of synchronization. Delayed
    work (batadv_dat_purge) schedules new timer/work while the device
    is being deleted. As the result new timer/delayed work is set after
    cancel_delayed_work_sync() was called. So after the device is freed
    the timer list contains pointer to already freed memory.
    
    Found by Linux Verification Center (linuxtesting.org) with syzkaller.
    
    Cc: stable@kernel.org
    Fixes: 2f1dfbe1 ("batman-adv: Distributed ARP Table - implement local storage")
    Signed-off-by: default avatarVladislav Efanov <VEfanov@ispras.ru>
    Acked-by: default avatarSven Eckelmann <sven@narfation.org>
    Signed-off-by: default avatarSimon Wunderlich <sw@simonwunderlich.de>
    abac3ac9
distributed-arp-table.c 50.5 KB