From 9923dd5ce5eede90944a029852916e33d2f17450 Mon Sep 17 00:00:00 2001 From: JackBurton79 Date: Thu, 16 Aug 2018 09:33:16 +0200 Subject: [PATCH] network stack: move put_device_interface() at the end of the Interface destructor. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #10919. Removing an interface triggers this sequence: datalink_control() calls interface->ReleaseReference() which causes the Interface destructor to be called. The Interface destructor calls put_device_interface(fDeviceInterface) which destroys the net_device_interface, then calls put_domain_datalink_protocols(this, datalink->domain) in a loop. put_domain_datalink_protocols() tries to access the deleted net_device_interface, hence the KDL. Change-Id: I2326bcd6d1fd80a69e5fdfa6629563b38ecdbbac Reviewed-on: https://review.haiku-os.org/469 Reviewed-by: waddlesplash Reviewed-by: Adrien Destugues Reviewed-by: Jérôme Duval --- src/add-ons/kernel/network/stack/interfaces.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 75cbd8c1bf..b710d29575 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -482,8 +482,6 @@ Interface::~Interface() { TRACE("Interface %p: destructor\n", this); - put_device_interface(fDeviceInterface); - // Uninitialize the domain datalink protocols DatalinkTable::Iterator iterator = fDatalinkTable.GetIterator(); @@ -501,6 +499,8 @@ Interface::~Interface() delete datalink; } + put_device_interface(fDeviceInterface); + recursive_lock_destroy(&fLock); // Release reference of the stack - at this point, our stack may be unloaded