1

Тема: Страшенный баг хуков

Не знаю даже, возможно вы о нем в курсе или это даже фича, но в вызове хуков таким образом

    $return = ($hook = get_hook('em_fn_is_valid_email_start')) ? eval($hook) : null;
    if ($return != null)
        return $return;

присутствует по моему мнению ОГРОМНЫЙ баг.

Если я верну из хука значение false, 0, пустую строку или массив, то условие

    if ($return != null)
        return $return;

выполнено не будет.

На примере функции is_valid_email(). Мой валидатор email вынес вердикт false для адреса, но так как условие выхода из функции не выполняется из-за нестрогого сравнения, то дальше выполняется стандартная валидация адреса и возращает true.

Моя сборка FluxBB 1.5 - fluxbb.qb7.ru, парсер сообщений с бб-кодами "Parserus" и анализатор useragent "UserAgentAnalyzer" - github.com/MioVisman/

Сайт Visman

Поделиться

2

Re: Страшенный баг хуков

Если вызвано из функции, выражение return немедленно прекращает выполнение текущей функции и возвращает свой аргумент как значение данной функции. return также завершит выполнение выражения eval() или всего файла скрипта.

(Please log in or register to see this URL)

(Please log in or register to see this URL)

Сайт Xakker

Поделиться

3

Re: Страшенный баг хуков

Xakker, и что?

Добавлено спустя 9 минут 17 секунд:

Пример бага на функции is_banned_email(), которая полностью переписана в хук для возможности блокировки email по домену любого уровня.
В функцию расставил логирование так:

function is_banned_email($email)
{
    global $forum_db, $forum_bans;

    $return = ($hook = get_hook('em_fn_is_banned_email_start')) ? eval($hook) : null;
echo "<pre>\n";
var_dump($return);
echo "</pre>\n";
    if ($return != null)
        return $return;
echo "kkk";
    foreach ($forum_bans as $cur_ban)
    {
        if ($cur_ban['email'] != '' &&
            ($email == $cur_ban['email'] ||
            (strpos($cur_ban['email'], '@') === false && stristr($email, '@'.$cur_ban['email']))))
            return true;
    }

    return false;
}

Ожидаю, что при заблокированном домене верхнего уровня pl хук отработает, вернет false (т.е. адрес не забанен, вот этот 3456@ex.2pl) и произойдет выход из функции с возратом false (вывода строки kkk не должно быть).
В действительности:

string(11) "3456@ex.2pl"

string(3) "2pl"
string(3) ".pl"
string(3) "@pl"

bool(false)

kkk

Значит выполняется цикл из оригинальной функции is_banned_email(), что совершенно не нужно.

Моя сборка FluxBB 1.5 - fluxbb.qb7.ru, парсер сообщений с бб-кодами "Parserus" и анализатор useragent "UserAgentAnalyzer" - github.com/MioVisman/

Сайт Visman

Поделиться

4

Re: Страшенный баг хуков

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

(Please log in or register to see this URL)

Сайт Xakker

Поделиться

5

Re: Страшенный баг хуков

Соглашусь с тем, что это скорее баг чем фича, но не с тем что это ОГРОМНЫЙ  баг smile
Это вроде первый случай отловленного неожиданного поведения. Будем устранять.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

6

Re: Страшенный баг хуков

hcs, за одно напомню и про PHP 7 и драйвера баз данных wink

Надо все

function DBLayer(

сменить на

function __construct(

и в этих же функциях убрать

        return $this->link_id;
Моя сборка FluxBB 1.5 - fluxbb.qb7.ru, парсер сообщений с бб-кодами "Parserus" и анализатор useragent "UserAgentAnalyzer" - github.com/MioVisman/

Сайт Visman

Поделиться

7

Re: Страшенный баг хуков

(Please log in or register to see this URL)

Добавлено спустя 11 минут 48 секунд:

Зачем убирать  return $this->link_id;?

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

8

Re: Страшенный баг хуков

hcs, а зачем он в конструкторе нужен?

Моя сборка FluxBB 1.5 - fluxbb.qb7.ru, парсер сообщений с бб-кодами "Parserus" и анализатор useragent "UserAgentAnalyzer" - github.com/MioVisman/

Сайт Visman

Поделиться

9

Re: Страшенный баг хуков

предложение по выносу обработчиков хуков в отдельные файлы
(Please log in or register to see this URL)

конструкция эквивалентная текущей

- избавляемcя от eval и склеивания строк в рантайме на каждый запрос
- получаем ленивую загрузку обработчиков и использование opcache
- оставляем совместимость с расширениями

Сайт Otto.Zukamoto

Поделиться

10

Re: Страшенный баг хуков

hcs, (Please log in or register to see this URL)

Моя сборка FluxBB 1.5 - fluxbb.qb7.ru, парсер сообщений с бб-кодами "Parserus" и анализатор useragent "UserAgentAnalyzer" - github.com/MioVisman/

Сайт Visman

Поделиться