segfault in IMAP APPEND with compressed maildir
Aki Tuomi
aki.tuomi at dovecot.fi
Tue Jun 7 08:54:07 UTC 2016
On 07.06.2016 11:52, Aki Tuomi wrote:
>
> On 07.06.2016 11:20, Roland Rosenfeld wrote:
>> Hi!
>>
>> After upgrading from Debian wheezy with (self compiled) dovecot 2.2.15
>> to Debian jessie with (self compiled) 2.2.24, I observe the following
>> segmentation fault in the logs:
>>
>> Jun 7 09:23:09 imap dovecot: imap(user at example.com): Error: read(<imap client>) failed: read(size=8003) failed: Connection reset by peer (uid=0, box=trash)
>> Jun 7 09:23:09 imap dovecot: imap(user at example.com): Error: zlib.read(/srv/mailstore/user at example.com/mail/.trash/tmp/1465283884.M336492P22902.imap): unexpected EOF at 88001
>> Jun 7 09:23:09 imap dovecot: imap(user at example.com): Error: read(zlib(/srv/mailstore/user at example.com/mail/.trash/tmp/1465283884.M336492P22902.imap)) failed: read(/srv/mailstore/user at example.com/mail/.trash/tmp/1465283884.M336492P22902.imap) failed: zlib.read(/srv/mailstore/user at example.com/mail/.trash/tmp/1465283884.M336492P22902.imap): unexpected EOF at 88001 (uid=0, box=trash)
>> Jun 7 09:23:09 imap dovecot: imap(user at example.com): Fatal: master: service(imap): child 22902 killed with signal 11 (core dumped)
>>
>> We also observed the same (rare) error in the past on the old system.
>> But on the old system, there were only the first 3 lines without the
>> segmentation fault, so we ignored the issue until now.
>>
>> The problem always happens on IMAP folders where the client writes to,
>> like "trash", "drafts", "sent" and the like.
>>
>> I wasn't able to actively reproduce this issue, but can only observe
>> in the logs that some customers run into this issue from time to time.
>>
>>
>> So all I have is a core dump with the following backtrace:
>>
>> Core was generated by `dovecot/imap'.
>> Program terminated with signal SIGSEGV, Segmentation fault.
>> (gdb) bt full
>> #0 0x00007f57e276f29f in i_stream_default_get_size (stream=0x1fd2790, exact=<optimized out>, size_r=0x7ffed3839718) at istream.c:807
>> No locals.
>> #1 0x00007f57e17024e4 in zlib_mail_close (_mail=0x1fd4de0) at zlib-plugin.c:170
>> mail = 0x1fd4de0
>> zmail = 0x1fd5398
>> zuser = 0x1fbd040
>> cache = 0x1fbd050
>> size = 33201320
>> #2 0x00007f57e2a2a8b9 in mailbox_save_cancel (_ctx=_ctx at entry=0x1fc4d48) at mail-storage.c:2117
>> ctx = 0x1fd3dd0
>> keywords = 0x0
>> mail = <optimized out>
>> __FUNCTION__ = "mailbox_save_cancel"
>> #3 0x000000000040c759 in cmd_append_finish (ctx=0x1fc4cf0) at cmd-append.c:149
>> __FUNCTION__ = "cmd_append_finish"
>> #4 0x000000000040c835 in client_input_append (cmd=0x1fc4bc0) at cmd-append.c:89
>> ctx = <optimized out>
>> client = 0x1fc3fc0
>> reason = 0x1f9e0b8 "Disconnected in APPEND (1 msgs, 306 secs, 188416/1122858 bytes)"
>> finished = <optimized out>
>> lit_offset = <optimized out>
>> __FUNCTION__ = "client_input_append"
>> #5 0x00007f57e2778dcc in io_loop_call_io (io=0x1fc4ad0) at ioloop.c:564
>> ioloop = 0x1fa6750
>> t_id = 2
>> __FUNCTION__ = "io_loop_call_io"
>> #6 0x00007f57e277a0f1 in io_loop_handler_run_internal (ioloop=ioloop at entry=0x1fa6750) at ioloop-epoll.c:220
>> ctx = 0x1fa8260
>> io = <optimized out>
>> tv = {tv_sec = 1799, tv_usec = 997118}
>> events_count = <optimized out>
>> msecs = <optimized out>
>> ret = 1
>> i = 0
>> j = <optimized out>
>> call = <optimized out>
>> __FUNCTION__ = "io_loop_handler_run_internal"
>> #7 0x00007f57e2778e55 in io_loop_handler_run (ioloop=ioloop at entry=0x1fa6750) at ioloop.c:612
>> No locals.
>> #8 0x00007f57e2778ff8 in io_loop_run (ioloop=0x1fa6750) at ioloop.c:588
>> __FUNCTION__ = "io_loop_run"
>> #9 0x00007f57e2713713 in master_service_run (service=0x1fa65f0, callback=callback at entry=0x423a20 <client_connected>) at master-service.c:640
>> No locals.
>> #10 0x000000000040c427 in main (argc=1, argv=0x1fa6390) at main.c:460
>> set_roots = {0x42c480 <imap_setting_parser_info>, 0x635440 <lda_setting_parser_info>, 0x0}
>> login_set = {auth_socket_path = 0x1f9e048 "ailed: Connection reset by peer", postlogin_socket_path = 0x0, postlogin_timeout_secs = 60,
>> callback = 0x424170 <login_client_connected>, failure_callback = 0x423b30 <login_client_failed>, request_auth_token = 1}
>> service_flags = <optimized out>
>> storage_service_flags = <optimized out>
>> username = 0x0
>> auth_socket_path = 0x42d42e "auth-master"
>> c = <optimized out>
>>
>>
>> This is on a server, which uses compressed maildir on a NFS storage.
>>
>> Here's dovecot -n output:
>>
>> # 2.2.24 (a82c823): /etc/dovecot/dovecot.conf
>> # Pigeonhole version 0.4.14 (099a97c)
>> # OS: Linux 3.16.0-4-amd64 x86_64 Debian 8.4
>> auth_cache_negative_ttl = 5 mins
>> auth_cache_size = 100 M
>> auth_cache_ttl = 15 mins
>> auth_default_realm = example.com
>> auth_master_user_separator = *
>> auth_mechanisms = plain login
>> auth_verbose = yes
>> dict {
>> acl = mysql:/etc/dovecot/dovecot-dict-sql.conf
>> }
>> disable_plaintext_auth = no
>> listen = *
>> log_timestamp = "%Y-%m-%d %H:%M:%S "
>> mail_fsync = always
>> mail_gid = 999
>> mail_location = maildir:~/mail
>> mail_plugins = acl quota zlib
>> mail_uid = 999
>> managesieve_notify_capability = mailto
>> managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext imapflags
>> mmap_disable = yes
>> namespace {
>> list = children
>> location = maildir:%%h/mail:INDEX=~/mail/shared/%%u
>> prefix = shared/%%u/
>> separator = /
>> subscriptions = no
>> type = shared
>> }
>> namespace inbox {
>> inbox = yes
>> location =
>> prefix =
>> separator = /
>> type = private
>> }
>> passdb {
>> args = /etc/dovecot/dovecot-sql.conf
>> driver = sql
>> }
>> plugin {
>> acl = vfile
>> acl_shared_dict = proxy::acl
>> quota = maildir
>> sieve = ~/.dovecot.sieve
>> sieve_dir = ~/mail/sieve
>> sieve_extensions = +imapflags
>> zlib_save = gz
>> }
>> pop3_no_flag_updates = yes
>> pop3_uidl_format = %v.%u
>> protocols = imap pop3 sieve
>> service auth {
>> unix_listener auth-master {
>> group = vmail
>> mode = 0600
>> user = vmail
>> }
>> }
>> service dict {
>> unix_listener dict {
>> group = vmail
>> mode = 0600
>> user = vmail
>> }
>> }
>> service imap {
>> process_limit = 4000
>> }
>> service managesieve-login {
>> inet_listener sieve {
>> port = 4190
>> }
>> }
>> service managesieve {
>> process_limit = 100
>> }
>> service pop3 {
>> process_limit = 1000
>> }
>> shutdown_clients = no
>> ssl = no
>> syslog_facility = local2
>> userdb {
>> args = /etc/dovecot/dovecot-sql.conf
>> driver = sql
>> }
>> verbose_proctitle = yes
>> protocol imap {
>> mail_max_userip_connections = 10
>> mail_plugins = acl quota zlib imap_quota imap_acl
>> }
>> protocol pop3 {
>> mail_plugins = acl quota zlib
>> }
>>
>>
>> I hope, that this is all required information to find and solve this issue.
>>
>> Greetings
>> Roland
> Hi!
>
> This would appear to be fixed in
> https://github.com/dovecot/core/commit/5df8396a7cbad0b38b83a86667fb3d4c223f6f7c
>
> ---
> Aki Tuomi
> Dovecot Oy
Sorry I mean
https://github.com/dovecot/core/commit/6bc001ee9dc03cb3107239861867cd674fd321d7
Aki
More information about the dovecot
mailing list