Патч для dk-filter, решающий проблему

Вчера я писал об ошибке в dk-filter, приводящей к гибели процесса, если dk-filter сконфигурирован использовать разные ключи для подписи сообщений от разных отправителей, и ключ для отправителя не найден.

Я предложил два решения: тривиальное (изменить файл конфигурации так, чтобы все отправители начинались со звёздочки) и правильное (пропатчить код демона, ибо фатальное завершение по такой пустяковой ошибке — это неправильно).

Именно о втором решении далее пойдёт речь.

Проблема решается путём наложения рук простого патча на файл libdk/dk.c:

--- dk-milter-1.0.0.dfsg.orig/libdk/dk.c
+++ dk-milter-1.0.0.dfsg/libdk/dk.c
@@ -1097,6 +1097,9 @@
        if (dk->dk_key != NULL)
            return DK_STAT_OK;
 
+       if (dk->dk_selector == NULL)
+           return DK_STAT_NOKEY;
+
        ssel = dk_sterilize(dk->dk_selector);
        if (ssel == NULL)
        {

Но, как я уже говорил, есть и другие проблемы, связанные с использованием неверных строк форматирования (аргументы, передаваемые в fprintf() и syslog(), не соответствуют строке форматирования).

Для решения этих проблем есть второй патч:

[-]
--- dk-milter-1.0.0.dfsg.orig/dk-filter/dk-filter.c
+++ dk-milter-1.0.0.dfsg/dk-filter/dk-filter.c
@@ -1468,7 +1468,7 @@
    {
        pthread_mutex_lock(&count_lock);
        thread_count++;
-       syslog(LOG_INFO, "thread %p connect (%d)", pthread_self(),
+       syslog(LOG_INFO, "thread %p connect (%d)", (void*)pthread_self(),
               thread_count);
        pthread_mutex_unlock(&count_lock);
    }
@@ -1561,7 +1561,7 @@
    assert(cc != NULL);
 
    if (DK_DEBUG('t'))
-       syslog(LOG_INFO, "thread %p envfrom", pthread_self());
+       syslog(LOG_INFO, "thread %p envfrom", (void*)pthread_self());
 
    /*
    **  Initialize a filter context.
@@ -1628,7 +1628,7 @@
    assert(headerv != NULL);
 
    if (DK_DEBUG('t'))
-       syslog(LOG_INFO, "thread %p header", pthread_self());
+       syslog(LOG_INFO, "thread %p header", (void*)pthread_self());
 
    cc = (connctx) smfi_getpriv(ctx);
    assert(cc != NULL);
@@ -1750,7 +1750,7 @@
 #endif /* !DEBUG */
 
    if (DK_DEBUG('t'))
-       syslog(LOG_INFO, "thread %p eoh", pthread_self());
+       syslog(LOG_INFO, "thread %p eoh", (void*)pthread_self());
 
    cc = (connctx) smfi_getpriv(ctx);
    assert(cc != NULL);
@@ -2176,7 +2176,7 @@
    assert(bodyp != NULL);
 
    if (DK_DEBUG('t'))
-       syslog(LOG_INFO, "thread %p body", pthread_self());
+       syslog(LOG_INFO, "thread %p body", (void*)pthread_self());
 
    cc = (connctx) smfi_getpriv(ctx);
    assert(cc != NULL);
@@ -2233,7 +2233,7 @@
 #endif /* !DEBUG */
 
    if (DK_DEBUG('t'))
-       syslog(LOG_INFO, "thread %p eom", pthread_self());
+       syslog(LOG_INFO, "thread %p eom", (void*)pthread_self());
 
    cc = (connctx) smfi_getpriv(ctx);
    assert(cc != NULL);
@@ -2623,7 +2623,7 @@
 mlfi_abort(SMFICTX *ctx)
 {
    if (DK_DEBUG('t'))
-       syslog(LOG_INFO, "thread %p abort", pthread_self());
+       syslog(LOG_INFO, "thread %p abort", (void*)pthread_self());
 
    dkf_cleanup(ctx);
    return SMFIS_CONTINUE;
@@ -2652,7 +2652,7 @@
    {
        pthread_mutex_lock(&count_lock);
        thread_count--;
-       syslog(LOG_INFO, "thread %p close (%d)", pthread_self(),
+       syslog(LOG_INFO, "thread %p close (%d)", (void*)pthread_self(),
               thread_count);
        pthread_mutex_unlock(&count_lock);
    }
@@ -3840,11 +3840,11 @@
        {
            if (dolog)
            {
-               syslog(LOG_ERR, "%s: read() wrong size (%u)",
+               syslog(LOG_ERR, "%s: read() wrong size (%zu)",
                       keyfile, rlen);
            }
 
-           fprintf(stderr, "%s: %s: read() wrong size (%u)\n",
+           fprintf(stderr, "%s: %s: read() wrong size (%zu)\n",
                    progname, keyfile, rlen);
 
            close(fd);

DEB-пакет для архитектуры AMD64 можно скачать отсюда.

Внимание: я не являюсь разработчиком dk-filter/dk-milter, поэтому патчи не являются официальными, и если Вы их используете, то только на свой страх и риск.

Добавить в закладки

Связанные записи

26
Июль
2009

Комментарии к статье «dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed: Часть 2»  »

К статье «dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed: Часть 2» комментариев пока нет. Не хотите ли стать первым?

Подписаться на RSS-ленту комментариев к статье «dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed: Часть 2» Trackback URL: http://blog.sjinks.org.ua/c-cpp/597-dk-filter-dk_sterilize-assertion-failed-part-2/trackback/

Оставить комментарий к записи «dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed: Часть 2»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, Вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя