Re: [Dovecot] deliver + quota failure
I investigated the deliver with quota's bug a little more (rc10, mysql, virtual domains, maildir). My log files reads:
deliver(test@ruijs.cc): Info: msgid=000f01c6fac1$bd4e8670$8801a8c0@Moskou: save failed to INBOX
deliver(test@ruijs.cc): Info: sieve runtime error: Keep: Generic Error
deliver(test@ruijs.cc): Info: msgid=000f01c6fac1$bd4e8670$8801a8c0@Moskou: save failed to INBOX
deliver(test@ruijs.cc): Error: open(ruijs.cc/test//.temp.in2sports2.vianetworks.nl.13210.72d247ac698d0019) failed: No such file or directory
deliver(mark@ruijs.cc): Info: msgid=dovecot-1162066721-407295-0@in2sports2.vianetworks.nl: saved mail to Junk
Dovecot tries to deliver, but notices quota exceeded. I don't think Sieve is playing a role here - I added Sieve before I encountered the problem.
Two problems:
The .dovecot.lda-dupes can't be written (that's what the
open...failed notice is about).
The Quota Exceed mail seem to contain mal-formed headers (that's
why it the notice-mail ends in my junk-folder).
Digging into deliver.c, I noticed that auth_client_put_user_env() changes the HOME environment from /var/mail (which is ok), to ruijs.cc/test/ (which is the maildir, relative to /var/mail). And then fopen fails (see the trace below). So I think that the code
auth_socket = getenv("AUTH_SOCKET_PATH");
if (auth_socket == NULL)
auth_socket = DEFAULT_AUTH_SOCKET_PATH;
ret = auth_client_put_user_env(ioloop, auth_socket,
destination, process_euid);
if (ret != 0)
return ret;
home = getenv("HOME");
if (home != NULL) {
/* If possible chdir to home directory so core file
could be written. If it fails, don't worry. */
(void)chdir(home);
is the key. Should the chdir be done *before* the call to auth_client_put_user_env()? I'm not familiar with the internal workings of the Dovecot LDA, so I won't suggest a proper fix. Who will.
As for the mal-formed headers, I'll take a look at it later.
Mark
#0 i_error (format=0x80ac5f7 "open(%s) failed: %m") at failures.c:203
#1 0x0809f900 in dotlock_create (path=0x9ece2c0 "ruijs.cc/test//.dovecot.lda-dupes", dotlock=0x9edfc48, flags=Variable "flags" is not available.
) at file-dotlock.c:265
#2 0x0809fb71 in file_dotlock_open (set=0x80b9c90, path=0x9ece2c0 "ruijs.cc/test//.dovecot.lda-dupes", flags=0, dotlock_r=0x9ee7920) at file-dotlock.c:614
#3 0x08056ec5 in duplicate_new (path=0x9ece2c0 "ruijs.cc/test//.dovecot.lda-dupes") at duplicate.c:157
#4 0x080571c6 in duplicate_mark (id=0x9ece270, id_size=55, user=0xbf9edb45 "test@ruijs.cc", time=1162163205) at duplicate.c:195
#5 0x080573c9 in mail_send_rejection (mail=0x9ede7e0, recipient=0xbf9edb45 "test@ruijs.cc", reason=0x9edc218 "Quota exceeded") at mail-send.c:51
#6 0x08056c51 in main (argc=5, argv=0xbf9ec5d4) at deliver.c:595
I also found the cause of why the Quota Exceeded message won't pass the spam/virusfilter in some cases. It only happens when the original mail is MIME. Then the reply mail contains the original mail, but only the headers. According to the Perl library MIME::Parser, the mail has a "unexpected end of preamble". It happed to be the following part:
--24332/in2sports2.vianetworks.nl-
Content-Type: message/rfc822
From: "Mark Ruijs" test@in2sports.net
To: test@ruijs.cc
Subject: w
Date: Sun, 29 Oct 2006 09:41:56 +0100
Content-Type: multipart/alternative;
boundary="----=_NextPart_000_0001_01C6FB3E.797DA7A0"
. more headers .
--24332/in2sports2.vianetworks.nl--
This is generated in deliver/mail-send.c, the function mail_send_rejection(struct mail *mail, const char *recipient, const char *reason):
/* original message's headers */
fprintf(f, "--%s\r\nContent-Type: message/rfc822\r\n\r\n", boundary);
input = mail_get_stream(mail, &hdr_size, NULL);
if (input != NULL) {
input = i_stream_create_limit(default_pool, input,
0, hdr_size.physical_size);
while ((ret = i_stream_read_data(input, &data, &size, 0)) > 0) {
fwrite(data, size, 1, f);
i_stream_skip(input, size);
}
My C is a bit rusty. Sure someone here can add a check in the while-loop to suppress output of the "Content-Type.boundary" part? Otherwise I'll give it a shot.
Mark
This is how I tested the (in)validity of the notice message:
#!/usr/bin/perl
require MIME::Parser;
MIME::Tools->debugging(1);
my $parser = new MIME::Parser;
$parser->ignore_errors(0);
$entity = $parser->parse(\*STDIN);
$entity->dump_skeleton;
Van: dovecot-bounces@dovecot.org [mailto:dovecot-bounces@dovecot.org] Namens Mark Ruijs Verzonden: zondag 29 oktober 2006 2:04 Aan: dovecot@dovecot.org Onderwerp: Re: [Dovecot] deliver + quota failure
I investigated the deliver with quota's bug a little more (rc10, mysql, virtual domains, maildir). My log files reads:
deliver(test@ruijs.cc): Info: msgid=000f01c6fac1$bd4e8670$8801a8c0@Moskou: save failed to INBOX
deliver(test@ruijs.cc): Info: sieve runtime error: Keep: Generic Error
deliver(test@ruijs.cc): Info: msgid=000f01c6fac1$bd4e8670$8801a8c0@Moskou: save failed to INBOX
deliver(test@ruijs.cc): Error: open(ruijs.cc/test//.temp.in2sports2.vianetworks.nl.13210.72d247ac698d0019) failed: No such file or directory
deliver(mark@ruijs.cc): Info: msgid=dovecot-1162066721-407295-0@in2sports2.vianetworks.nl: saved mail to Junk
Dovecot tries to deliver, but notices quota exceeded. I don't think Sieve is playing a role here - I added Sieve before I encountered the problem.
Two problems:
The .dovecot.lda-dupes can't be written (that's what the open...failed notice is about).
The Quota Exceed mail seem to contain mal-formed headers (that's why it the notice-mail ends in my junk-folder).
Digging into deliver.c, I noticed that auth_client_put_user_env() changes the HOME environment from /var/mail (which is ok), to ruijs.cc/test/ (which is the maildir, relative to /var/mail). And then fopen fails (see the trace below). So I think that the code
auth_socket = getenv("AUTH_SOCKET_PATH");
if (auth_socket == NULL)
auth_socket = DEFAULT_AUTH_SOCKET_PATH;
ret = auth_client_put_user_env(ioloop, auth_socket,
destination, process_euid);
if (ret != 0)
return ret;
home = getenv("HOME");
if (home != NULL) {
/* If possible chdir to home directory so core file
could be written. If it fails, don't worry. */
(void)chdir(home);
is the key. Should the chdir be done *before* the call to auth_client_put_user_env()? I'm not familiar with the internal workings of the Dovecot LDA, so I won't suggest a proper fix. Who will.
As for the mal-formed headers, I'll take a look at it later.
Mark
#0 i_error (format=0x80ac5f7 "open(%s) failed: %m") at failures.c:203
#1 0x0809f900 in dotlock_create (path=0x9ece2c0 "ruijs.cc/test//.dovecot.lda-dupes", dotlock=0x9edfc48, flags=Variable "flags" is not available.
) at file-dotlock.c:265
#2 0x0809fb71 in file_dotlock_open (set=0x80b9c90, path=0x9ece2c0 "ruijs.cc/test//.dovecot.lda-dupes", flags=0, dotlock_r=0x9ee7920) at file-dotlock.c:614
#3 0x08056ec5 in duplicate_new (path=0x9ece2c0 "ruijs.cc/test//.dovecot.lda-dupes") at duplicate.c:157
#4 0x080571c6 in duplicate_mark (id=0x9ece270, id_size=55, user=0xbf9edb45 "test@ruijs.cc", time=1162163205) at duplicate.c:195
#5 0x080573c9 in mail_send_rejection (mail=0x9ede7e0, recipient=0xbf9edb45 "test@ruijs.cc", reason=0x9edc218 "Quota exceeded") at mail-send.c:51
#6 0x08056c51 in main (argc=5, argv=0xbf9ec5d4) at deliver.c:595
On Sun, 2006-10-29 at 10:45 +0100, Mark Ruijs wrote:
I also found the cause of why the Quota Exceeded message won’t pass the spam/virusfilter in some cases. It only happens when the original mail is MIME. Then the reply mail contains the original mail, but only the headers. According to the Perl library MIME::Parser, the mail has a “unexpected end of preamble”. It happed to be the following part: .. My C is a bit rusty. Sure someone here can add a check in the while-loop to suppress output of the “Content-Type…boundary” part?
OK, done. I didn't test this properly, so please reply if this works or not:
http://dovecot.org/list/dovecot-cvs/2006-November/006658.html
Hi Timo,
Yes, your patch got it right! The
| Your message was automatically rejected by Dovecot Mail Delivery Agent. | | The following reason was given: | Quota exceeded
mail passes Spamassassin even when the original mail is MIME-encoded. No bad-headers anymore. Thanks!
Mark
PS. It might be nice if the original subject is used instead of "Automatically rejected mail", but that's a detail.
PPS. Your advice not to use relative paths in maildir helped. No more open failures when deliver wants to write the .dovecot.lda-dupes file.
-----Oorspronkelijk bericht----- Van: Timo Sirainen [mailto:tss@iki.fi] Verzonden: donderdag 2 november 2006 21:54 Aan: Mark Ruijs CC: dovecot@dovecot.org Onderwerp: Re: [Dovecot] deliver + quota failure
On Sun, 2006-10-29 at 10:45 +0100, Mark Ruijs wrote:
I also found the cause of why the Quota Exceeded message won't pass the spam/virusfilter in some cases. It only happens when the original mail is MIME. Then the reply mail contains the original mail, but only the headers. According to the Perl library MIME::Parser, the mail has a "unexpected end of preamble". It happed to be the following part: .. My C is a bit rusty. Sure someone here can add a check in the while-loop to suppress output of the "Content-Type.boundary" part?
OK, done. I didn't test this properly, so please reply if this works or not:
http://dovecot.org/list/dovecot-cvs/2006-November/006658.html
On Sun, 2006-10-29 at 02:04 +0100, Mark Ruijs wrote:
Digging into deliver.c, I noticed that auth_client_put_user_env() changes the HOME environment from /var/mail (which is ok), to ruijs.cc/test/ (which is the maildir, relative to /var/mail).
How's Dovecot supposed to know it's relative to /var/mail? Why does it even work with imap/pop?
Don't use relative paths for home directory..
participants (3)
-
Mark Ruijs
-
Mark Ruys
-
Timo Sirainen