Нашел баг

Обсуждение программы редиректора
Ответить
temp_user
Сообщения: 2
Зарегистрирован: Чт июл 24, 2008 12:17

Нашел баг

Сообщение temp_user »

Добрый день

Столкнулся с плавающей ошибкой, как минимум,в версии rejik-3.2.6.
При использовании некоторых регулярных выражений, ссылки часто не ловились.Причем, внутри проблемных ссылок встречались закодированные символы - %xx. Если их подменять на оригинальные символы, ссылки в 100% случаев ловились.

Ошибка никак не проявлялась при ручном запуске режика(даже в потоковом режиме). Но гарантировано проявлялась в сквиде - каждый процесс режика детектил ссылку только первый раз, потом пропускал.
Т.е. после блокировки страницы достаточно было прорефрешить страницу(возможно несколько раз,что бы попасть на "нужный" процесс режика), что бы ссылка прогрузилась. Также можно было,убивая плохой "процесс" режика,снова добиваться однократной блокировки.

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

Основная идея ошибки - длина строки после unescape может меняться,а код это не учитывает. Поэтому проявление ошибки сильно зависит от каждого конкретного регулярного выражения и каждой конкретной строки-url,которая проверяется этой регуляркой.

Хотелось бы услышать комментарий автора.

Патч:
--- /2/redirector/pcre.c 2010-04-13 15:45:32.000000000 +0300
+++ /1/redirector/pcre.c 2010-07-15 21:27:22.000000000 +0300
@@ -102,9 +102,9 @@
for (i=0;i<redir[section]->ban_pcre_count;i++)

#ifdef CASE_INDEPENDENT
- if(pcre_exec(redir[section]->ban_pcre,redir[section]->ban_pcre_s,input_url_uc,strlen(input_url),0,PCRE_NOTEMPTY,vector,vecsize)>=0)
+ if(pcre_exec(redir[section]->ban_pcre,redir[section]->ban_pcre_s,input_url_uc,strlen(input_url_uc),0,PCRE_NOTEMPTY,vector,vecsize)>=0)
#else
- if(pcre_exec(redir[section]->ban_pcre,redir[section]->ban_pcre_s,input_url_un,strlen(input_url),0,PCRE_NOTEMPTY,vector,vecsize)>=0)
+ if(pcre_exec(redir[section]->ban_pcre,redir[section]->ban_pcre_s,input_url_un,strlen(input_url_un),0,PCRE_NOTEMPTY,vector,vecsize)>=0)
#endif
{
sprintf(change_reason,"(pcre rule#: %d)",(unsigned char)(i+1));

Slava
Site Admin
Сообщения: 2251
Зарегистрирован: Пт апр 02, 2004 12:34
Контактная информация:

Сообщение Slava »

Спасибо, что помогли найти ошибку!

Патч включен в новый релиз.

Ответить