• Taehee Yoo's avatar
    net: core: limit nested device depth · 5343da4c
    Taehee Yoo authored
    Current code doesn't limit the number of nested devices.
    Nested devices would be handled recursively and this needs huge stack
    memory. So, unlimited nested devices could make stack overflow.
    
    This patch adds upper_level and lower_level, they are common variables
    and represent maximum lower/upper depth.
    When upper/lower device is attached or dettached,
    {lower/upper}_level are updated. and if maximum depth is bigger than 8,
    attach routine fails and returns -EMLINK.
    
    In addition, this patch converts recursive routine of
    netdev_walk_all_{lower/upper} to iterator routine.
    
    Test commands:
        ip link add dummy0 type dummy
        ip link add link dummy0 name vlan1 type vlan id 1
        ip link set vlan1 up
    
        for i in {2..55}
        do
    	    let A=$i-1
    
    	    ip link add vlan$i link vlan$A type vlan id $i
        done
        ip link del dummy0
    
    Splat looks like:
    [  155.513226][  T908] BUG: KASAN: use-after-free in __unwind_start+0x71/0x850
    [  155.514162][  T908] Write of size 88 at addr ffff8880608a6cc0 by task ip/908
    [  155.515048][  T908]
    [  155.515333][  T908] CPU: 0 PID: 908 Comm: ip Not tainted 5.4.0-rc3+ #96
    [  155.516147][  T908] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
    [  155.517233][  T908] Call Trace:
    [  155.517627][  T908]
    [  155.517918][  T908] Allocated by task 0:
    [  155.518412][  T908] (stack is not available)
    [  155.518955][  T908]
    [  155.519228][  T908] Freed by task 0:
    [  155.519885][  T908] (stack is not available)
    [  155.520452][  T908]
    [  155.520729][  T908] The buggy address belongs to the object at ffff8880608a6ac0
    [  155.520729][  T908]  which belongs to the cache names_cache of size 4096
    [  155.522387][  T908] The buggy address is located 512 bytes inside of
    [  155.522387][  T908]  4096-byte region [ffff8880608a6ac0, ffff8880608a7ac0)
    [  155.523920][  T908] The buggy address belongs to the page:
    [  155.524552][  T908] page:ffffea0001822800 refcount:1 mapcount:0 mapping:ffff88806c657cc0 index:0x0 compound_mapcount:0
    [  155.525836][  T908] flags: 0x100000000010200(slab|head)
    [  155.526445][  T908] raw: 0100000000010200 ffffea0001813808 ffffea0001a26c08 ffff88806c657cc0
    [  155.527424][  T908] raw: 0000000000000000 0000000000070007 00000001ffffffff 0000000000000000
    [  155.528429][  T908] page dumped because: kasan: bad access detected
    [  155.529158][  T908]
    [  155.529410][  T908] Memory state around the buggy address:
    [  155.530060][  T908]  ffff8880608a6b80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  155.530971][  T908]  ffff8880608a6c00: fb fb fb fb fb f1 f1 f1 f1 00 f2 f2 f2 f3 f3 f3
    [  155.531889][  T908] >ffff8880608a6c80: f3 fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  155.532806][  T908]                                            ^
    [  155.533509][  T908]  ffff8880608a6d00: fb fb fb fb fb fb fb fb fb f1 f1 f1 f1 00 00 00
    [  155.534436][  T908]  ffff8880608a6d80: f2 f3 f3 f3 f3 fb fb fb 00 00 00 00 00 00 00 00
    [ ... ]
    Signed-off-by: default avatarTaehee Yoo <ap420073@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5343da4c
dev.c 252 KB