php-библиотека: не резолвятся некоторые IP в memory_mode

Что-то не работает? Пишите здесь.

php-библиотека: не резолвятся некоторые IP в memory_mode

UNREAD_POST alsv » 18.05.2016 18:22:33

Здравствуйте!
Обнаружил баг, который воспроизводится в memory_mode: для некоторых ip-адресов $seek в readData оказывается больше, чем соответствующая переменная с данными:
Код: Выделить всё
   if ($this->memory_mode) {
        var_dump([strlen($type == 1 ? $this->regions_db : $this->cities_db), $seek, $max]);
   $raw = substr($type == 1 ? $this->regions_db : $this->cities_db, $seek, $max);


array(3) {
  [0]=>
  int(3088018)
  [1]=>
  int(3091501)
  [2]=>
  int(119)
}


Для текущей версии базы первый IP на котором это воспроизводится — 2.8.40.1
В обычном режиме видна информация по городу и стране, в memory_mode одни нули.
alsv
 
Сообщения: 1
Зарегистрирован: 18.05.2016 12:29:57

Re: php-библиотека: не резолвятся некоторые IP в memory_mode

UNREAD_POST arzfreezy » 13.11.2016 23:14:08

Проблема имеется и в новейшей версии БД от 2016.10.17.

Варианты решения проблемы:

1. Правильный

Авторы БД исправляют метаданные (city_size) и у нас все начинает работать.

2. Для любителей рисковать

Работает только для БД от 2016.10.17, проверялось на OS X:
Код: Выделить всё
printf '\x00\x2f\x47\x78' | dd of=SxGeoCity.dat bs=1 seek=28 count=4 conv=notrunc

Тут мы пишем в метаданные (city_size) новый размер: 3098488 (hex=2F4778). Он взялся так: размер, указанный в метаданных 3089102 + сколько мы не дочитали 9387 - EOF 1 = 3098488.

3. Полу-костыльный

Читаем базу городов до конца файла:

Код: Выделить всё
// Заменяем чтение БД городов:
$this->cities_db  = $info['city_size'] > 0 ? fread($this->fh, $info['city_size']) : '';

// На полное чтение до конца файла:
while (true) {
  $tmp = fread($this->fh, $info['city_size']);
  if ($tmp) $this->cities_db .= $tmp;
  else break;
}


TL;DR;

Опишу, что обнаружил. Ошибку заметил по IP-адресу "188.246.160.178".

Согласно спецификации https://sypexgeo.net/ru/docs/sxgeo22/ в конце файла у нас занесена информация по городам. Но если:
Код: Выделить всё
// После чтения городов:
$this->cities_db  = $info['city_size'] > 0 ? fread($this->fh, $info['city_size']) : '';

// Вывести позицию и, считали ли мы весь файл:
echo "is eof: " . (feof($this->fh) ? "y" : "n") . ", ftell: " . ftell($this->fh) . "\n";


То увидим:
is eof: n, ftell: 13411813


Нет - не считали, и находимся мы на 13411813 байте, тогда как размер БД - 13421200 байт. Таким образом, мы не досчитались 13421200 - 13411813 = 9387 байт.
arzfreezy
 
Сообщения: 1
Зарегистрирован: 13.11.2016 22:56:46

Re: php-библиотека: не резолвятся некоторые IP в memory_mode

UNREAD_POST zapimir » 15.11.2016 19:25:22

Спасибо за сообщение пофиксим в ближайшее время.
zapimir
Site Admin
 
Сообщения: 1627
Зарегистрирован: 01.10.2009 22:39:52


Вернуться в Проблемы и баги

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Яндекс.Метрика