Strip invalid UTF-8 char from end of player names. (#545)

This commit is contained in:
Nicholas Hastings 2016-10-02 18:34:27 -04:00 committed by GitHub
parent a54ee12ade
commit 999f37800c

View File

@ -1963,7 +1963,6 @@ CPlayer::CPlayer()
void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity) void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
{ {
m_IsConnected = true; m_IsConnected = true;
m_Name.assign(name);
m_Ip.assign(ip); m_Ip.assign(ip);
m_pEdict = pEntity; m_pEdict = pEntity;
m_iIndex = IndexOfEdict(pEntity); m_iIndex = IndexOfEdict(pEntity);
@ -1972,6 +1971,8 @@ void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
m_Serial.bits.index = m_iIndex; m_Serial.bits.index = m_iIndex;
m_Serial.bits.serial = g_PlayerSerialCount++; m_Serial.bits.serial = g_PlayerSerialCount++;
SetName(name);
char ip2[24], *ptr; char ip2[24], *ptr;
ke::SafeStrcpy(ip2, sizeof(ip2), ip); ke::SafeStrcpy(ip2, sizeof(ip2), ip);
if ((ptr = strchr(ip2, ':')) != NULL) if ((ptr = strchr(ip2, ':')) != NULL)
@ -2135,7 +2136,30 @@ void CPlayer::Disconnect()
void CPlayer::SetName(const char *name) void CPlayer::SetName(const char *name)
{ {
m_Name.assign(name); // Player names from Steam can get truncated in the engine, leaving
// a partial, invalid UTF-8 char at the end. Strip it off.
char szNewName[MAX_PLAYER_NAME_LENGTH];
ke::SafeStrcpy(szNewName, sizeof(szNewName), name);
size_t i = 0;
while (i < sizeof(szNewName))
{
if (szNewName[i] == 0)
break;
unsigned int cCharBytes = _GetUTF8CharBytes(&szNewName[i]);
size_t newPos = i + cCharBytes;
if (newPos > (sizeof(szNewName) - 1))
{
szNewName[i] = 0;
break;
}
i = newPos;
}
m_Name.assign(szNewName);
} }
const char *CPlayer::GetName() const char *CPlayer::GetName()