Сообщение от
Иван Бубнов
Просто написал 23 раза @0 (0 ид игрока). Никнейм игрока ид 0:
haew970f
Не получилось воспроизвести ошибку, на моём тестовом сервере никаких выходов за пределы массива нет.
Я даже сделал контрольные буферы до и после обрабатываемой строки, инициализировал их нулями и проверял неизменность значений в них после выполнения ParseReferences (crashdetect не всегда может самостоятельно определить выход за пределы массива в нативных строковых функциях, поэтому приходится так костылить), всё чисто.
Тем не менее, я только что исправил баг, из-за которого при неправильно введённых ID (например "@playerid" вместо "@1") брался никнейм игрока с ID 0.
PHP код:
ParseReferences(const text[], output[], size = sizeof(output))
{ // by Daniel_Cortez \\pro-pawn.ru
static size_m_1, nickname_pos1, nickname_pos2, ref_id, pos1, pos2, c;
size_m_1 = size - 1;
pos1 = 0, pos2 = strlen(output);
for(;;)
{
if(text[pos1] == '@')
{
nickname_pos1 = pos1, nickname_pos2 = pos2;
ref_id = 0;
while('0' <= (c = text[++pos1]) <= '9')
ref_id = ref_id * 10 + (c - '0');
if ((pos1 == nickname_pos1+1) || (0 == IsPlayerConnected(ref_id)))
output[pos2++] = '@', pos1 = nickname_pos1 + 1;
else
pos2 += GetPlayerName(
ref_id,
output[nickname_pos2],
size - nickname_pos2
);
}
else if((output[pos2++] = text[pos1++]) == '\0')
break;
if(pos2 == size_m_1)
{
output[pos2] = '\0';
break;
}
}
}