diff --git a/Changes b/Changes index 815c83e72..1cadd4488 100644 --- a/Changes +++ b/Changes @@ -1359,3 +1359,5 @@ Ron2K (#0002942). - Fixed bug in MODE #channel showing extended channel mode parameters when not in #channel. - Made 'MODE #channel b' and friends show bans to ircops even when not in channel. +- Fixes to SVSNICK: case-change no longer causes a collision, don't return the value from + exit_client (which would be FLUSH_BUFFER), fix QUIT not being sent back on collision. diff --git a/src/modules/m_svsnick.c b/src/modules/m_svsnick.c index 4c4b1fc21..0308f956d 100644 --- a/src/modules/m_svsnick.c +++ b/src/modules/m_svsnick.c @@ -91,6 +91,7 @@ DLLFUNC int MOD_UNLOAD(m_svsnick)(int module_unload) int m_svsnick(aClient *cptr, aClient *sptr, int parc, char *parv[]) { aClient *acptr; +aClient *ocptr; /* Other client */ if (!IsULine(sptr) || parc < 4 || (strlen(parv[2]) > NICKLEN)) return -1; /* This looks like an error anyway -Studded */ @@ -104,10 +105,13 @@ aClient *acptr; if (!(acptr = find_person(parv[1], NULL))) return 0; /* User not found, bail out */ - if (find_client(parv[2], NULL)) /* Collision */ - return exit_client(cptr, acptr, sptr, + if ((ocptr = find_client(parv[2], NULL)) && ocptr != acptr) /* Collision */ + { + exit_client(acptr, acptr, sptr, "Nickname collision due to Services enforced " "nickname change, your nick was overruled"); + return 0; + } acptr->umodes &= ~UMODE_REGNICK; acptr->lastnick = TS2ts(parv[3]);