Thomas Leuxner put forth on 11/27/2010 11:56 PM:
> Am 27.11.2010 um 20:44 schrieb Timo Sirainen:
> 
>> Nothing in Dovecot's log? Typically this should log an error.
> 
> Nov 28 06:49:23 spectre postfix/qmgr[6175]: 4608E408C: 
> from=<[email protected]>, size=307431, nrcpt=1 (queue active)
> Nov 28 06:49:23 spectre postfix/lmtp[18445]: 4608E408C: 
> to=<[email protected]>, relay=spectre.leuxner.net[private/dovecot-lmtp], 
> delay=2360, delays=2360/0.01/0/0.01, dsn=4.3.0, status=deferred (host 
> spectre.leuxner.net[private/dovecot-lmtp] said: 451 4.3.0 Temporary internal 
> failure (in reply to end of DATA command))
> 
> Another mail stuck. Just a hunch: Mails over 128k cause trouble…

http://www.dovecot.org/list/dovecot-cvs/2009-April/013190.html

Below, I believe, is the code generating the error.  And it seems you're
absolutely right about the 128KB issue.  It seems the lmtpd is trying to
append the mail to "/tmp/dovecot.lmtp." if the email is greater than
128KB.  Is it possible the permissions you have on /tmp aren't
compatible with lmtpd?


 static void client_input_data_handle(struct client *client)
@@ -353,7 +407,11 @@ static void client_input_data_handle(str
                        }
                } else if (client->state.data_end_idx == DATA_DOT_NEXT_POS) {
                        /* saw a dot at the beginning of line. drop it. */
-                       client_input_add(client, data, i-1);
+                       if (client_input_add(client, data, i-1) < 0) {
+                               client_destroy(client, "451 4.3.0",
+                                              "Temporary internal failure");
+                               return;
+                       }
                        start = i;
                        client->state.data_end_idx = 0;
                } else {
@@ -366,7 +424,11 @@ static void client_input_data_handle(str
                rewind = client->state.data_end_idx - DATA_DOT_NEXT_POS + 1;
                i -= rewind; size -= rewind;
        }
-       client_input_add(client, data + start, i-start);
+       if (client_input_add(client, data + start, i-start) < 0) {
+               client_destroy(client, "451 4.3.0",
+                              "Temporary internal failure");
+               return;
+       }
        i_stream_skip(client->input, skip == 0 ? i : skip);

        if (i < size) {

-- 
Stan

Reply via email to