• Florian Zumbiehl's avatar
    [PPPOE]: race between interface going down and connect() · 74b885cf
    Florian Zumbiehl authored
    below you find a patch that (hopefully) fixes a race between an interface
    going down and a connect() to a peer on that interface. Before,
    connect() would determine that an interface is up, then the interface
    could go down and all entries referring to that interface in the
    item_hash_table would be marked as ZOMBIEs and their references to
    the device would be freed, and after that, connect() would put a new
    entry into the hash table referring to the device that meanwhile is
    down already - which also would cause unregister_netdevice() to wait
    until the socket has been release()d.
    
    This patch does not suffice if we are not allowed to accept connect()s
    referring to a device that we already acked a NETDEV_GOING_DOWN for
    (that is: all references are only guaranteed to be freed after
    NETDEV_DOWN has been acknowledged, not necessarily after the
    NETDEV_GOING_DOWN already). And if we are allowed to, we could avoid
    looking through the hash table upon NETDEV_GOING_DOWN completely and
    only do that once we get the NETDEV_DOWN ...
    
    mostrows:
    pppoe_flush_dev is called on NETDEV_GOING_DOWN and NETDEV_DOWN to deal with
    this "late connect" issue.  Ideally one would hope to notify users at the
    "NETDEV_GOING_DOWN" phase (just to pretend to be nice).  However, it is the
    NETDEV_DOWN scan that takes all the responsibility for ensuring nobody is
    hanging around at that time.
    Signed-off-by: default avatarFlorian Zumbiehl <florz@florz.de>
    Acked-by: default avatarMichal Ostrowski <mostrows@earthlink.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    74b885cf
pppoe.c 25.5 KB