Hi!
On Thu, 20 May 1999, Mokryshev Sergey wrote:
> Несколько раз (в не очень понятных ситуациях) отказывался перекладывать
> Outlook Express'ную почту из локального ящика в серверный с такой же
> диагностикой. Вот, нашел, в message.c
>
> /* Check for valid header name */
> if (sawnl && buf[0] != ' ' && buf[0] != '\t') {
> if (buf[0] == ':') return IMAP_MESSAGE_BADHEADER;
> for (p = (unsigned char *)buf; *p != ':'; p++) {
> if (*p <= ' ') return IMAP_MESSAGE_BADHEADER;
> }
> }
>
> Я не силен в C, попробуй посмотреть сам. Но это единственное место,
> где происходит проверка с выдачей именно этого сообщения.
Мне, честно говоря, совершенно непонятно осталось, что именно эти гаврики
здесь проверяли. Т.е. более глупой проверки представить нельзя. Я ее
переделал и добавил немного диагностики - посмотри diff к message.c в
конце письма.
Я не знаю, на что именно ругался cyrus в тех твоих редких случаях, но
теперь по крайней мере в syslog будет заголовок выводиться, который
cyrus'у не нравится.
Кстати, я увидел в чем ошибка была. cyrus совершенно не воспринимает
строку 'From doka@... May 21 ...' которая BSD mailbox compatible. По
крайней мере понятно в каком направлении копаться дальше :-)
BTW ну и пишут... Не могу представить, чем можно объяснить присутствие
таких строк в исходнике:
for(p = (unsigned char*) buf; *p; p++);
sawnl = (p[-1] == '\n');
вместо: sawnl = (p[strlen(buf)-1] == '\n');
Я тащусь... Интересно, много там такого?
--
doka
============================ Cut here ============================
--- imap/message.c.orig Thu Oct 29 22:16:31 1998
+++ imap/message.c Fri May 21 00:35:13 1999
@@ -240,7 +240,7 @@
else {
sawcr = 0;
blankline = 0;
- if (inheader && *p >= 0x80) {
+ if (inheader && *p >= 0x80 && *p < 0xC0) {
if (reject8bit) {
/* We have been configured to reject all mail of this
form. */
@@ -275,18 +275,21 @@
/* Check for valid header name */
if (sawnl && buf[0] != ' ' && buf[0] != '\t') {
- if (buf[0] == ':') return IMAP_MESSAGE_BADHEADER;
- for (p = (unsigned char *)buf; *p != ':'; p++) {
- if (*p <= ' ') return IMAP_MESSAGE_BADHEADER;
- }
+ p = strchr(buf, ':');
+ if (!p || p == (unsigned char *)buf || p[1] != ' ') {
+ syslog(LOG_ERR, "Bad header: '%s'", buf);
+ return IMAP_MESSAGE_BADHEADER;
+ }
+ else
+ for (p--; p >= (unsigned char *)buf; p--)
+ /* Only A-Z, a-z and '-' allowed in message's headers */
+ if (*p != '-' && (*p < 'A' || *p > 'Z') && (*p < 'a' || *p > 'z')) {
+ syslog(LOG_ERR, "Bad header: '%s'", buf);
+ return IMAP_MESSAGE_BADHEADER;
+ }
}
- /* Used to be some 8bit checks here but those were moved above so that
- we could do something other than refuse the message.
- Unfortunately, we still need to look for the end of the string. */
- for(p = (unsigned char*) buf; *p; p++);
-
- sawnl = (p[-1] == '\n');
+ sawnl = (p[strlen(buf)-1] == '\n');
}
}
=============================================================================
"inet-admins" Internet access mailing list. Maintained by East Connection ISP.
Mail "unsubscribe inet-admins" to Majordomo@info.east.ru if you want to quit.
Archive is accessible on http://info.east.ru/rus/inetadm.html