IMAP session hangs on 8k-long commands if COMPRESS=DEFLATE is enabled
Stephan Bosch
stephan at rename-it.nl
Sat Dec 7 00:25:18 EET 2019
On 13/11/2019 00:22, Guilhem Moulin via dovecot wrote:
> Hi there,
>
> Dovecot 2.3.7 appears to hang when the client sends a long command after
> enabling the IMAP COMPRESS extension [RFC 4978]. PoC script attached
> along with the doveconf(1) output.
>
> Without COMPRESS=DEFLATE, and with the default ‘imap_max_line_length’
> value (64k) I'm able send commands up to 65539 bytes long (that's 3
> bytes more than 2¹⁶, so maybe the leading tag and the trailing CRLF
> aren't counted), after which Dovecot rightfully replies with tagged BAD
> responses.
>
> $ COMPRESS=n /tmp/many-fetch.pl 65539
> […]
> C: x UID FETCH 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,… [65539 bytes]
> S: x OK Fetch completed (0.005 + 0.001 + 0.004 secs).
> C: x UID FETCH 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,… [65540 bytes]
> S: x BAD Error in IMAP command UID FETCH: IMAP command line too large (0.001 + 0.001 secs).
> C: x UID FETCH 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,… [65541 bytes]
> S: x BAD Error in IMAP command UID FETCH: IMAP command line too large (0.001 + 0.001 secs).
>
> With COMPRESS=DEFLATE however, the server never sends anything back when
> the command size exceeds 8192 bytes:
>
> $ COMPRESS=y /tmp/many-fetch.pl 8192
> […]
> S: x OK [READ-ONLY] Examine completed (0.001 + 0.000 secs).
> C: x UID FETCH 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,… [8191 bytes]
> S: x OK Fetch completed (0.001 + 0.000 secs).
> C: x UID FETCH 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,… [8192 bytes]
> S: x OK Fetch completed (0.001 + 0.000 secs).
> C: x UID FETCH 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,… [8193 bytes]
> [ _hangs until the server terminates the session for inactivity_ ]
> S: * BYE Disconnected for inactivity.
>
> strace(1) show that Dovecot didn't send the response, even though the
> server log indicates that it's able to fully read the command.
>
> Interestingly, when setting ‘imap_max_line_length’ to 4096, the server
> also hangs after receiving a command of size >4096 bytes (instead of
> replying with a tagged BAD response).
>
> $ COMPRESS=y /tmp/many-fetch.pl 4096
> C: x UID FETCH 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,… [4095 bytes]
> S: x OK Fetch completed (0.001 + 0.000 secs).
> C: x UID FETCH 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,… [4096 bytes]
> S: x OK Fetch completed (0.001 + 0.000 secs).
> C: x UID FETCH 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,… [4097 bytes]
> [ _hangs until the server terminates the session for inactivity_ ]
>
> I'm also able to reproduce the buggy behavior against Dovecot versions
> found in other Debian releases. It's identical with 2.3.4 (Buster), the
> server also hang past 8192 bytes. 2.2.27 (Stretch) and 2.2.13 (Jessie)
> are able to send replies to 8k-long commands, but hang past 65536 bytes.
> For all 3 releases, without COMPRESS=DEFLATE Dovecot doesn't hang and
> rightfully sends tagged BAD responses to commands of size >65539 bytes.
>
> So while the hanging behavior appears to be a long-standing bug, the
> fact that's it's now hit at min($imap_max_line_length, 8192) instead of
> $imap_max_line_length seems to be a regression from somewhere between
> 2.2.27 and 2.3.4.
I was able to confirm this problem with the current master. Tracking
internally as DOP-1591.
Regards,
Stephan.
More information about the dovecot
mailing list