Почему request_rec :: filename NULL, когда в моем модуле Apache 2.2 вызывается функция ap_hook_type_checker? - PullRequest
1 голос
/ 19 августа 2011

У меня есть модуль Apache, который правильно работает в CentOS, но не работает в Ubuntu.Я отследил проблему до того факта, что запись запроса содержит значение NULL для имени файла в структуре request_rec, которую Apache передает в качестве аргумента функции ловушки, которую я определил в своем модуле, чтобы проверить тип файла дляфайл обрабатывается.

, т. е.,

extern "C" module AP_MODULE_DECLARE_DATA  MyModule = {
STANDARD20_MODULE_STUFF,     // initializer
NULL,                        // create per-dir config
NULL,                        // merge per-dir config
NULL,                        // server config
NULL,                        // merge server config
MyCommandTable,              // command table
MyRegisterHooks              // register hooks
};

... с

static void MyRegisterHooks(apr_pool_t *p)
{
ap_hook_child_init(MyPluginInit, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_type_checker(MyCheckAppFileType, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_handler(MyFileHandler,NULL,NULL,APR_HOOK_MIDDLE);
}

... и, наконец, виновной функцией:

static int MyCheckAppFileType(request_rec *ap_req)
{
if(ap_req == NULL)
{
    return DECLINED; // Not reached
}

if(ap_req->filename == NULL)
{
    return DECLINED; // HERE is the problem ... Why is ap_req->filename NULL?
                     // On CentOS it is not NULL, only on Ubuntu.
}

    // ...
}

Я использую Apache 2.2 как в Ubuntu, так и в CentOS, и я с нуля собрал модуль на обеих системах.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ ~ 3 месяца спустя: я обнаружил, что собираю модульна CentOS, а затем скопировать двоичный файл в Ubuntu, и это работает.Взятие идентичного кода и его сборка в Ubuntu вызывает вышеуказанный сбой во время выполнения.Следовательно, код не обязательно является проблемой - или, по крайней мере, что-то обрабатывается компилятором по-разному в двух системах, что приводит к успеху в сборке CentOS, но не в сборке Ubuntu.

1 Ответ

0 голосов
/ 21 сентября 2011

Я столкнулся с почти идентичной проблемой только сейчас. Я использую модуль, который кто-то написал. На одной тестовой машине модуль правильно выполнял authN и authZ. На другом компьютере r->filename находился NULL внутри крюка проверки подлинности. Ваш вопрос возник первым в моем поиске в Google.

В моем случае я отследил его до неправильного использования ap_set_module_config. Код выглядел так:

ap_set_module_config(r, &auth_my_module, attrs);

Исходный код ap_set_module_config гласит:

/**
 * Generic accessors for other modules to set at their own module-specific
 * data
 * @param conf_vector The vector in which the modules configuration is stored.
 *        usually r->per_dir_config or s->module_config
 * @param m The module to set the data for.
 * @param val The module-specific data to set
 */
AP_DECLARE(void) ap_set_module_config(ap_conf_vector_t *cv, const module *m,
                                      void *val);

Я изменил вызов на ap_set_module_config на это:

ap_set_module_config(r->per_dir_config, &auth_my_module, attrs);

И точно так же, как магия, r->filename больше не NULL в хуке проверки подлинности. Я новичок в написании модулей Apache, поэтому мне нужно выяснить, что именно это означает, но я рад, что понял, в чем проблема. Вы можете проверить свой код, чтобы увидеть, как вы звоните ap_set_module_config.

Редактировать: Я должен добавить, что отследил это, добавив отладочные операторы, которые точно указывали мне, когда поле filename структуры request_rec стало NULL. Для меня оно перешло от действительного к NULL внутри крючка, который я определил.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...