Index: code/server/sv_client.c =================================================================== --- code/server/sv_client.c (revision 789) +++ code/server/sv_client.c (working copy) @@ -417,7 +417,7 @@ newcl->netchan_end_queue = &newcl->netchan_start_queue; // save the userinfo - Q_strncpyz( newcl->userinfo, userinfo, sizeof(newcl->userinfo) ); + SV_SetUserinfo((newcl - svs.clients), userinfo); // get the game a chance to reject this connection or modify the userinfo denied = VM_Call( gvm, GAME_CLIENT_CONNECT, clientNum, qtrue, qfalse ); // firstTime = qtrue @@ -1222,7 +1222,7 @@ ================== */ static void SV_UpdateUserinfo_f( client_t *cl ) { - Q_strncpyz( cl->userinfo, Cmd_Argv(1), sizeof(cl->userinfo) ); + SV_SetUserinfo((cl - svs.clients), Cmd_Argv(1)); SV_UserinfoChanged( cl ); // call prog code to allow overrides Index: code/server/sv_init.c =================================================================== --- code/server/sv_init.c (revision 789) +++ code/server/sv_init.c (working copy) @@ -127,6 +127,9 @@ =============== */ void SV_SetUserinfo( int index, const char *val ) { + char name[MAX_NAME_LENGTH] = {""}; + int i, j; + if ( index < 0 || index >= sv_maxclients->integer ) { Com_Error (ERR_DROP, "SV_SetUserinfo: bad index %i\n", index); } @@ -136,7 +139,19 @@ } Q_strncpyz( svs.clients[index].userinfo, val, sizeof( svs.clients[ index ].userinfo ) ); - Q_strncpyz( svs.clients[index].name, Info_ValueForKey( val, "name" ), sizeof(svs.clients[index].name) ); + + // extended or special chars not allowed in name + Q_strncpyz(name, Info_ValueForKey(svs.clients[index].userinfo, "name"), + sizeof(name)); + svs.clients[index].name[0] = '\0'; + for( i = 0, j = 0; name[i]; i++ ) { + if(!(name[i] >= 32 && name[i] < 127)) + continue; + svs.clients[index].name[j++] = name[i]; + svs.clients[index].name[j] = '\0'; + } + Info_SetValueForKey(svs.clients[index].userinfo, "name", + svs.clients[index].name); }