• Florian Fainelli's avatar
    net: dsa: Fix stale cpu_switch reference after unbind then bind · b07ac989
    Florian Fainelli authored
    Commit 9520ed8f ("net: dsa: use cpu_switch instead of ds[0]")
    replaced the use of dst->ds[0] with dst->cpu_switch since that is
    functionally equivalent, however, we can now run into an use after free
    scenario after unbinding then rebinding the switch driver.
    
    The use after free happens because we do correctly initialize
    dst->cpu_switch the first time we probe in dsa_cpu_parse(), then we
    unbind the driver: dsa_dst_unapply() is called, and we rebind again.
    dst->cpu_switch now points to a freed "ds" structure, and so when we
    finally dereference it in dsa_cpu_port_ethtool_setup(), we oops.
    
    To fix this, simply set dst->cpu_switch to NULL in dsa_dst_unapply()
    which guarantees that we always correctly re-assign dst->cpu_switch in
    dsa_cpu_parse().
    
    Fixes: 9520ed8f ("net: dsa: use cpu_switch instead of ds[0]")
    Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Reviewed-by: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b07ac989
dsa2.c 16.9 KB