Фатальная ошибка при отправлении сообщения

На днях столкнулся с неприятной ошибкой: при отправлении письма dk-filter падал с ошибкой

dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed..

В баг-трекере Debian решения проблемы не нашлось (хотя проблеме больше года), пришлось все решать самому (люблю open source!).

Проблема проявлялась, когда dk-filter был запущен в конфигурации, использующей несколько ключей для подписывания сообщений (грубо говоря, каждому домену полагался свой ключ).

Функция dk_sterilize() вызывается всего из трёх мест в коде программы (причём от одного вызова можно безболезненно избавиться): два раза для домена, один раз для селектора. Как ни странно, ошибка возникала в коде, отвечающем за селектор (это при том, что он передаётся через аргументы командной строки).

Для понимания сути ошибки очень важно понимать разницу между DKIM и DomainKeys: в первом случае идентификация осуществляется по домену отправителя, а во втором — по адресу отправителя. В случае с dk-filter если в конфигурационном файле не находится соответствие имени отправителя (а не домена, как я ошибочно полагал), то процесс вылетает по ошибке.

Тем не менее, моя ошибка — это лишь часть картины: например, если файл с ключами имеет такой вид:

[-]
View Code Text
sender1@example.com:/etc/mail/sender1/mail
sender2@example.com:/etc/mail/sender2/mail
sender3@example.com:/etc/mail/sender3/mail

а письмо отправляется от имени пользователя sender4@example.com, то процесс всё равно вылетит по ошибке.

Есть два решения:

  1. Самое простое: использовать символы подстановки, например: *@example.com:/etc/mail/default/mail. В этом случае если подписывающий ключ для отправителя не найден, будет использован ключ /etc/mail/default/
  2. Второй путь более сложный (но и более правильный, так как поведение программы некорректно): пропатчить исходник (я над этим работаю).

Вообще в плане безопасности dk-filter мне не очень нравится, в частности, из-за предупреждений типа

[-]
View Code Text
dk-filter.c:3844: предупреждение: формат ‘%u’ предполагает тип ‘unsigned int’, но аргумент 4 имеет тип ‘size_t’
dk-filter.c:3848: предупреждение: формат ‘%u’ предполагает тип ‘unsigned int’, но аргумент 5 имеет тип ‘size_t’

и прочих. Потому что есть системы, на которых sizeof(size_t) != sizeof(unsigned int). Посмотрим, что получится исправить.

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

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

25
Июль
2009

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

  1. [...] « dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed. [...]

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

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

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

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

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