diff --git a/irc/client_lookup_set.go b/irc/client_lookup_set.go index 2256c4f9..c97c89ff 100644 --- a/irc/client_lookup_set.go +++ b/irc/client_lookup_set.go @@ -117,7 +117,7 @@ func (clients *ClientManager) SetNick(client *Client, session *Session, newNick } if useAccountName { - if registered && newNick != accountName && newNick != "" { + if registered && newNick != accountName { return "", errNickAccountMismatch, false } newNick = accountName diff --git a/irc/handlers.go b/irc/handlers.go index b15e011a..0b5e470c 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -2045,14 +2045,22 @@ func namesHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respon // NICK func nickHandler(server *Server, client *Client, msg ircmsg.Message, rb *ResponseBuffer) bool { + newNick := msg.Params[0] if client.registered { if client.account == "" && server.Config().Accounts.NickReservation.ForbidAnonNickChanges { rb.Add(nil, server.name, ERR_UNKNOWNERROR, client.Nick(), client.t("You may not change your nickname")) return false } - performNickChange(server, client, client, nil, msg.Params[0], rb) + performNickChange(server, client, client, nil, newNick, rb) } else { - client.preregNick = msg.Params[0] + if newNick == "" { + // #1933: this would leave (*Client).preregNick at its zero value of "", + // which is the same condition as NICK not having been sent yet --- + // so we need to send an error immediately + rb.Add(nil, server.name, ERR_NONICKNAMEGIVEN, "*", client.t("No nickname given")) + return false + } + client.preregNick = newNick } return false }