dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed.
Фатальная ошибка при отправлении сообщения
На днях столкнулся с неприятной ошибкой: при отправлении письма 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 если в конфигурационном файле не находится соответствие имени отправителя (а не домена, как я ошибочно полагал), то процесс вылетает по ошибке.
Тем не менее, моя ошибка — это лишь часть картины: например, если файл с ключами имеет такой вид:
sender2@example.com:/etc/mail/sender2/mail
sender3@example.com:/etc/mail/sender3/mail
а письмо отправляется от имени пользователя sender4@example.com, то процесс всё равно вылетит по ошибке.
Есть два решения:
- Самое простое: использовать символы подстановки, например:
*@example.com:/etc/mail/default/mail. В этом случае если подписывающий ключ для отправителя не найден, будет использован ключ/etc/mail/default/ - Второй путь более сложный (но и более правильный, так как поведение программы некорректно): пропатчить исходник (я над этим работаю).
Вообще в плане безопасности dk-filter мне не очень нравится, в частности, из-за предупреждений типа
dk-filter.c:3848: предупреждение: формат ‘%u’ предполагает тип ‘unsigned int’, но аргумент 5 имеет тип ‘size_t’
и прочих. Потому что есть системы, на которых sizeof(size_t) != sizeof(unsigned int). Посмотрим, что получится исправить.
Июл
2009
Комментарии к статье «dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed.» (1) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «dk-filter: util.c:47: dk_sterilize: Assertion `str != ((void *)0)’ failed.»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


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