* 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
This commit is contained in:
@@ -679,6 +679,9 @@ Interface::AddressAt(size_t index)
|
|||||||
int32
|
int32
|
||||||
Interface::IndexOfAddress(InterfaceAddress* address)
|
Interface::IndexOfAddress(InterfaceAddress* address)
|
||||||
{
|
{
|
||||||
|
if (address == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
RecursiveLocker locker(fLock);
|
RecursiveLocker locker(fLock);
|
||||||
|
|
||||||
AddressList::Iterator iterator = fAddresses.GetIterator();
|
AddressList::Iterator iterator = fAddresses.GetIterator();
|
||||||
@@ -709,7 +712,15 @@ Interface::RemoveAddresses()
|
|||||||
RecursiveLocker locker(fLock);
|
RecursiveLocker locker(fLock);
|
||||||
|
|
||||||
while (InterfaceAddress* address = fAddresses.RemoveHead()) {
|
while (InterfaceAddress* address = fAddresses.RemoveHead()) {
|
||||||
|
locker.Unlock();
|
||||||
|
|
||||||
address->ReleaseReference();
|
address->ReleaseReference();
|
||||||
|
if (address->LocalIsDefined()) {
|
||||||
|
MutexLocker hashLocker(sHashLock);
|
||||||
|
sAddressTable.Remove(address);
|
||||||
|
}
|
||||||
|
|
||||||
|
locker.Lock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user