fix a crash in the server if a slave server is unregistered
This commit is contained in:
parent
64c50ece35
commit
e0dc85a5f1
1 changed files with 11 additions and 6 deletions
|
@ -90,7 +90,7 @@ CServerListManager::CServerListManager ( const quint16 iNPortNum,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// per definition, the first entry in the server list it the own server
|
// per definition, the first entry in the server list is the own server
|
||||||
ServerList.append ( ThisServerListEntry );
|
ServerList.append ( ThisServerListEntry );
|
||||||
|
|
||||||
// parse the predefined server infos (if any) according to definition:
|
// parse the predefined server infos (if any) according to definition:
|
||||||
|
@ -234,8 +234,10 @@ void CServerListManager::OnTimerPollList()
|
||||||
{
|
{
|
||||||
QMutexLocker locker ( &Mutex );
|
QMutexLocker locker ( &Mutex );
|
||||||
|
|
||||||
// check all list entries except of the very first one (which is the central
|
// Check all list entries except of the very first one (which is the central
|
||||||
// server entry) and the predefined servers if they are still valid
|
// server entry) and the predefined servers if they are still valid.
|
||||||
|
// Note that we have to use "ServerList.size()" function in the for loop
|
||||||
|
// since we may remove elements from the server list inside the for loop.
|
||||||
for ( int iIdx = 1 + iNumPredefinedServers; iIdx < ServerList.size(); iIdx++ )
|
for ( int iIdx = 1 + iNumPredefinedServers; iIdx < ServerList.size(); iIdx++ )
|
||||||
{
|
{
|
||||||
// 1 minute = 60 * 1000 ms
|
// 1 minute = 60 * 1000 ms
|
||||||
|
@ -316,7 +318,7 @@ void CServerListManager::CentralServerUnregisterServer ( const CHostAddress& Ine
|
||||||
|
|
||||||
// Find the server to unregister in the list. The very first list entry
|
// Find the server to unregister in the list. The very first list entry
|
||||||
// must not be checked since this is per definition the central server
|
// must not be checked since this is per definition the central server
|
||||||
// (i.e., this server), also the predefined servers must not be checked
|
// (i.e., this server), also the predefined servers must not be checked.
|
||||||
for ( int iIdx = 1 + iNumPredefinedServers; iIdx < iCurServerListSize; iIdx++ )
|
for ( int iIdx = 1 + iNumPredefinedServers; iIdx < iCurServerListSize; iIdx++ )
|
||||||
{
|
{
|
||||||
if ( ServerList[iIdx].HostAddr == InetAddr )
|
if ( ServerList[iIdx].HostAddr == InetAddr )
|
||||||
|
@ -324,8 +326,11 @@ void CServerListManager::CentralServerUnregisterServer ( const CHostAddress& Ine
|
||||||
// remove this list entry
|
// remove this list entry
|
||||||
ServerList.removeAt ( iIdx );
|
ServerList.removeAt ( iIdx );
|
||||||
|
|
||||||
// entry found, leave for-loop
|
// entry found, leave for-loop (it is important to exit the
|
||||||
continue;
|
// for loop since when we remove an item from the server list,
|
||||||
|
// "iCurServerListSize" is not correct anymore and we could get
|
||||||
|
// a segmentation fault)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue