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 * Parserus - BBCode parser

Поделиться

2

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

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

http://php.net/manual/ru/function.return.php

Новые стили и расширения на  PunBB.INFO

Поделиться

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 * Parserus - BBCode parser

Поделиться

4

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

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

Новые стили и расширения на  PunBB.INFO

Поделиться

5

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

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

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

Поделиться

6

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

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

Надо все

function DBLayer(

сменить на

function __construct(

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

        return $this->link_id;
Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться

7

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

https://github.com/punbb/punbb/commit/6 … 98d8406efe

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

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

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

Поделиться

8

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

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

Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться

9

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

предложение по выносу обработчиков хуков в отдельные файлы
https://github.com/punbb/punbb/issues/131

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

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

Сайт Otto.Zukamoto

Поделиться

10

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

hcs, https://github.com/punbb/punbb/pull/138

Моя сборка FluxBB 1.5 * Parserus - BBCode parser

Поделиться