Skip to content
  • Dan Williams's avatar
    core: don't do anything interesting in NMDevice dispose() · c93ae45b
    Dan Williams authored
    The NMDevice dispose() function contained some badly-duplicated logic
    about when to deactivate a device on its last ref.  This logic should
    only run when the device is removed by the manager, since the  manager
    controls the device's life-cycle, and the manager knows best when to
    clean up the device.  But since it was tied to the device's refcount,
    it could have run later than the manager wanted, or not at all.
    
    It gets better.  Dispose duplicated logic that was already done in
    nm_device_cleanup(), and then *called* nm_device_cleanup() if the
    device was still activated and managed.  But the manager already
    unmanages the device when removing it, which triggers a call to
    nm_device_cleanup(), takes the device down, and resets the IPv6
    sysctl properties, which dispose() duplicated too.  So by the time
    dispose() runs, the device should already be unmanaged if the
    manager wants to deconfigure it, and most of the dispose() code
    should be a no-op.
    
    Clean all that up and remove duplicated functions.  Now, the flow
    should be like this:
    
    1) manager decides to remove the device and calls remove_device()
    2) if the device should be deconfigured, the manager unmanages
       the device
    3) the NMDevice state change handler tears down the active connection
       via nm_device_cleanup() and resets IPv6 sysctl properties
    4) when the device's last reference is finally released, only internal
       data members are freed in dispose() because the device should
       already have been cleaned up by the manager and be unmanaged
    5) if the device should be left running because it has an assumable
       connection, then the device is not unmanaged, and no cleanup
       happens in the state change handler or in dispose()
    c93ae45b