From b0766602db4993cd9747711af9f67a83e288af3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 11 Feb 2011 20:21:03 +0000 Subject: [PATCH] * RemoveAddresses() needs to remove the addresses from the hash table as well. This fixes random memory access on interface removal. * Optimized IndexOfAddress() for NULL addresses. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40447 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/network/stack/interfaces.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 284e879156..fc857b0e86 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -679,6 +679,9 @@ Interface::AddressAt(size_t index) int32 Interface::IndexOfAddress(InterfaceAddress* address) { + if (address == NULL) + return -1; + RecursiveLocker locker(fLock); AddressList::Iterator iterator = fAddresses.GetIterator(); @@ -709,7 +712,15 @@ Interface::RemoveAddresses() RecursiveLocker locker(fLock); while (InterfaceAddress* address = fAddresses.RemoveHead()) { + locker.Unlock(); + address->ReleaseReference(); + if (address->LocalIsDefined()) { + MutexLocker hashLocker(sHashLock); + sAddressTable.Remove(address); + } + + locker.Lock(); } }