|
@@ -116,6 +116,8 @@ func (clients *ClientManager) SetNick(client *Client, session *Session, newNick
|
116
|
116
|
useAccountName = alwaysOn || config.Accounts.NickReservation.ForceNickEqualsAccount
|
117
|
117
|
}
|
118
|
118
|
|
|
119
|
+ nickIsReserved := false
|
|
120
|
+
|
119
|
121
|
if useAccountName {
|
120
|
122
|
if registered && newNick != accountName {
|
121
|
123
|
return "", errNickAccountMismatch, false
|
|
@@ -167,7 +169,9 @@ func (clients *ClientManager) SetNick(client *Client, session *Session, newNick
|
167
|
169
|
|
168
|
170
|
reservedAccount, method := client.server.accounts.EnforcementStatus(newCfNick, newSkeleton)
|
169
|
171
|
if method == NickEnforcementStrict && reservedAccount != "" && reservedAccount != account {
|
170
|
|
- return "", errNicknameReserved, false
|
|
172
|
+ // see #2135: we want to enter the critical section, see if the nick is actually in use,
|
|
173
|
+ // and return errNicknameInUse in that case
|
|
174
|
+ nickIsReserved = true
|
171
|
175
|
}
|
172
|
176
|
}
|
173
|
177
|
|
|
@@ -219,6 +223,9 @@ func (clients *ClientManager) SetNick(client *Client, session *Session, newNick
|
219
|
223
|
if skeletonHolder != nil && skeletonHolder != client {
|
220
|
224
|
return "", errNicknameInUse, false
|
221
|
225
|
}
|
|
226
|
+ if nickIsReserved {
|
|
227
|
+ return "", errNicknameReserved, false
|
|
228
|
+ }
|
222
|
229
|
|
223
|
230
|
if dryRun {
|
224
|
231
|
return "", nil, false
|