Страница 1 из 1

Нашел баг

Добавлено: Чт июл 15, 2010 22:48
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));

Добавлено: Пт июл 16, 2010 11:06
Slava
Спасибо, что помогли найти ошибку!

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