lmtp service timeouting even after receiving full message

Arkadiusz Miśkiewicz arekm at maven.pl
Fri Mar 23 10:04:46 EET 2018


On Thursday 22 of March 2018, Arkadiusz Miśkiewicz wrote:
> I have a problem with some messages passed from exim to dovecot lmtp
> service:
> 
> From exim debug:
> 
> using socket /var/run/dovecot/lmtp
>   LMTP<< 220 mbox8 ready
>   LMTP>> LHLO mbox8...
>   LMTP<< 250-mbox8
>   LMTP<< 250-STARTTLS
>   LMTP<< 250-8BITMIME
>   LMTP<< 250-ENHANCEDSTATUSCODES
>   LMTP<< 250 PIPELINING
>   LMTP>> MAIL FROM:...
>   LMTP<< 250 2.1.0 OK
>   LMTP>> RCPT TO:...
>   LMTP<< 250 2.1.5 OK
>   LMTP>> DATA
>   LMTP<< 354 OK
>   LMTP>> writing message and terminating "."
> cannot use sendfile for body: terminating dot wanted
> writing data block fd=6 size=6585 timeout=300
>   LMTP>> QUIT
>   LMTP<< 421 4.4.2 mbox8 Disconnected client for inactivity
> 
> 
> now above "writting message and terminating" according to exim strace looks
> like this:
> 
> 13413 22:07:24 write(2, "  LMTP>> writing message and terminating \".\"\n",
> 45) = 45 <0.000018> 13413 22:07:24 stat("/etc/localtime",
> {st_mode=S_IFREG|0644, st_size=2705, ...}) = 0 <0.000025> 13413 22:07:24
> write(2, "cannot use sendfile for body: terminating dot wanted\n", 53) =
> 53 <0.000022> 13413 22:07:24 lseek(3, 19, SEEK_SET)   = 19 <0.000015>
> [...]
> 13413 22:07:24 write(2, "writing data block fd=6 size=6585 timeout=300\n",
> 46) = 46 <0.000019> 13413 22:07:24 alarm(300)               = 0 <0.000013>
> 13413 22:07:24 write(6, "Return-path:
> [...]
> \nwrap\"><br></span></div>.\n", 6585) = 6585 <0.000023>
> 
> and then exim waits for dovecot lmtp to say it accepted message but lmtp
> never does that.
> 
> Isn't .\n always enough for dovecot to signal end of message? Because exim
> wrote full message to dovecot lmtp unix socket.
> 
> Now the interesting this - exim does only one write() with 6585 bytes to
> write that message to lmtp. If exim needs more than one write() to do that
> (message is larger by some buffer) then it succeeds, dovecot accepts it.
> 
> Could dovecot lmtp handling for single write() case be broken?
> 
> dovecot 2.2.35

And reproducer. Both messages have ".\n" as ending but one has \r\n before it.

#!/usr/bin/python3
  
import socket

c = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
c.connect("/var/run/dovecot/lmtp")
print(c.recv(1024))
print("LHLO")
c.send(b"LHLO mbox8\r\n")
print(c.recv(1024))
print("MAIL FROM")
c.send(b"MAIL FROM:<someone at example.com>\r\n")
print(c.recv(1024))
print("RCPT TO")
c.send(b"RCPT TO:<arekm at example.com>\r\n")
print(c.recv(1024))
print("DATA")
c.send(b"DATA\r\n")
print(c.recv(1024))
print("body...")

msg_fail = b"testtest<br></span></div>.\n"
msg_ok = b"01, 41.82, 30.14\r\n.\n"

#c.send(msg_ok)                                                                                                                                                                              
c.send(msg_fail)

print(c.recv(1024))

c.close()

-- 
Arkadiusz Miśkiewicz, arekm / ( maven.pl | pld-linux.org )


More information about the dovecot mailing list