ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 

  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: Inet-Admins
Inet-Admins mailing list archive (inet-admins@info.east.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [inet-admins] Cyrus troubles



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



 




Copyright © Lexa Software, 1996-2009.