LGSL и Counter-Strike: Source

Окт 9th, 2010

В мониторинге заметил странную особенность, у некоторых CSS серверов напрочь не хотела отображаться страница с подробной информацией.

Разобраться дошли руки только сейчас. Все оказалось в том что сервера отвечали сжатыми данными (BZip), а LGSL их не очень правильно воспринимал.

Если быть более точным то, LGSL стандартно принимает все пакеты, обнаруживает по первому пакету что это 4й тип (BZip данные) и режет, тут то собака и зарыта. От серверов чаще всего приходило 2 пакета, начало и продолжение. А LGSL воспринимал это как 2 разных пакета и обрезал в начале по 18 байт. Хотя если пакет "продолжение" у него нужно обрезать 10 байт.

Не буду дальше продолжать и углубляться в мат. часть предоставлю сразу исправления:

Открыть: ./lgsl_files/lgsl_protocol.php
Найти:

1
elseif ($packet_type == 4) { $packet_order = ord($packet[9]);      $packet = substr($packet, 18); }

Заменить на:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
			elseif ($packet_type == 4) 
			{ 
				$packet_order = ord($packet[9]);
 
				if ($packet_order == 0)
				{
					list(, $packet_checksum) = unpack('V', substr($packet, 14, 4)); // CRC32 checksum
					$packet = substr($packet, 18); 
				}
				else
				{
					$packet = substr($packet, 10); 
				}
			}

Найти:

1
$buffer = bzdecompress($buffer);

Добавить ниже:

1
2
3
4
5
	  		if (crc32($buffer) != $packet_checksum)
			{
				$server['e']['bzip2'] = "unavailable"; $lgsl_need['e'] = FALSE;
				return TRUE;
			}

Закрыть и загрузить на сервер.
Все.

No comments yet.
Перед отправкой формы:
Human test by Not Captcha