Fatal error with IMAP MOVE from a shared mailbox to Trash folder
Hello everyone. I have a problem using Dovecot 2.2.26 with ACL plugin and deleting e-mails from a shared mailbox.
My user doesn't have the "expunge" permission on the shared mailbox, but it has the "write-deleted" permission. So, when I delete a message from the shared mailbox using a client that implements the IMAP MOVE command, it tries to move the message to my Trash folder. Then the server closes the connection to the client (process aborted) and I get three lines in the log file with a backtrace and "Fatal" error. In this case the message doesn't get copied or moved from the shared folder and the client complaints. I found the same thing happens whenever I try to move anything between folders of the shared mailbox itself, while logged in with my user. I can move messages inside my own mailbox just fine.
If I try the same operation from a client that uses the IMAP COPY + DELETE commands, no errors are logged and the outcome is as expected: the message gets copied from the shared folder to my Trash and gets the flag "\Deleted" set on the shared folder.
My setup is as follows:
Dovecot: 2.2.26.0 OS: Ubuntu 16.04.1 LTS CPU architecture: x86_64 Filesystem: ext4
The relevant lines from mail.err log:
Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Panic: file mail-storage.c: line 2143 (mailbox_save_context_reset): assertion failed: (ctx->copying_via_save) Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Error: Raw backtrace: /usr/lib/dovecot/libdovecot.so.0(+0x9438e) [0x7fbcd478538e] -> /usr/lib/dovecot/libdovecot.so.0(+0x9447c) [0x7fbcd478547c] -> /usr/lib/dovecot/libdovecot.so.0(i_fatal+0) [0x7fbcd471ea4e] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0x41b78) [0x7fbcd4a50b78] -> /usr/lib/dovecot/libdovecot-storage.so.0(mailbox_save_cancel+0x73) [0x7fbcd4a53d73] -> /usr/lib/dovecot/modules/lib01_acl_plugin.so(+0xe142) [0x7fbcd3f1d142] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0x4516d) [0x7fbcd4a5416d] -> /usr/lib/dovecot/libdovecot-storage.so.0(mailbox_move+0x23) [0x7fbcd4a54333] -> dovecot/imap(+0xf9c5) [0x557cf98629c5] -> dovecot/imap(command_exec+0xa6) [0x557cf986f196] -> dovecot/imap(+0x1a4c2) [0x557cf986d4c2] -> dovecot/imap(+0x1a550) [0x557cf986d550] -> dovecot/imap(client_handle_input+0x195) [0x557cf986d915] -> dovecot/imap(client_input+0x85) [0x557cf986de25] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_call_io+0x4c) [0x7fbcd4799bdc] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run_internal+0x10a) [0x7fbcd479b09a] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run+0x25) [0x7fbcd4799c65] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_run+0x38) [0x7fbcd4799e08] -> /usr/lib/dovecot/libdovecot.so.0(master_service_run+0x13) [0x7fbcd4724f53] -> dovecot/imap(main+0x322) [0x557cf9860ca2] -> /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7fbcd4348830] -> dovecot/imap(+0xde1f) [0x557cf9860e1f] Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Fatal: master: service(imap): child 6907 killed with signal 6 (core dumped)
Dovecot configuration (doveadm -n):
# 2.2.26.0 (23d1de6): /etc/dovecot/dovecot.conf # Pigeonhole version 0.4.16 (fed8554) # OS: Linux 4.4.0-57-generic x86_64 Ubuntu 16.04.1 LTS auth_cache_negative_ttl = 10 mins auth_cache_size = 2 M auth_master_user_separator = * auth_mechanisms = plain login first_valid_uid = 12 last_valid_uid = 12 mail_location = maildir:~/Maildir mail_plugins = acl quota notify mail_log stats lazy_expunge 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 namespace casellecondivise { list = children location = maildir:%%h/Maildir:INDEXPVT=~/Maildir/shared/%%u prefix = Caselle condivise/%%u/ separator = / subscriptions = no type = shared } namespace expunged { hidden = yes list = no location = maildir:/var/expunged/%n/Expunged prefix = EXPUNGED/ separator = / } namespace inbox { inbox = yes location = mailbox Archive { auto = subscribe special_use = \Archive } mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } mailbox Sent { auto = subscribe special_use = \Sent } mailbox Trash { auto = subscribe special_use = \Trash } prefix = separator = / type = private } passdb { args = /etc/dovecot/dovecot-ldap.conf.ext driver = ldap } plugin { acl = vfile:/etc/dovecot/global-acls:cache_secs=300 acl_shared_dict = file:/etc/dovecot/shared/shared-mailboxes lazy_expunge = EXPUNGED/ lazy_expunge_only_last_instance = yes mail_log_events = delete copy flag_change save undelete expunge mail_log_fields = uid box msgid size quota = maildir:user quota quota_exceeded_message = (Quota exceeded) La casella di posta elettronica del destinatario è piena. quota_rule = *:storage=1G quota_rule2 = Trash:storage=+100M quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=100%% quota-warning 100 %u sieve = file:~/sieve;active=~/.dovecot.sieve stats_command_min_time = 1 mins stats_domain_min_time = 12 hours stats_ip_min_time = 12 hours stats_memory_limit = 32 M stats_refresh = 30 secs stats_session_min_time = 15 mins stats_track_cmds = yes stats_user_min_time = 1 hours } protocols = " imap sieve" service auth { unix_listener /var/spool/postfix/private/auth { group = mail mode = 0666 user = postfix } unix_listener auth-userdb { group = mail user = mail } } service dict { unix_listener dict { group = mail mode = 0600 user = mail } } service imap-login { process_limit = 300 process_min_avail = 2 } service managesieve-login { inet_listener sieve { port = 4190 } } service quota-warning { executable = script /etc/dovecot/scripts/quota-warning.sh unix_listener quota-warning { group = mail user = mail } } service stats { fifo_listener stats-mail { mode = 0600 user = mail } } ssl = required ssl_cert = </etc/ssl/certs/pac.apg23.org.pem ssl_key = # hidden, use -P to show it userdb { args = /etc/dovecot/dovecot-sql.conf.ext default_fields = uid=mail gid=mail home=/var/mail/%u master_user=%u driver = sql } userdb { args = /etc/dovecot/dovecot-ldap.conf.ext default_fields = uid=mail gid=mail home=/var/mail/%u master_user=%u driver = ldap } protocol lda { mail_plugins = acl quota notify mail_log stats lazy_expunge sieve } protocol imap { mail_max_userip_connections = 25 mail_plugins = acl quota notify mail_log stats lazy_expunge imap_quota imap_stats }
I tested this with different users with the same result. I tested and reproduced the error with Thunderbird and Roundcube. The Apple Mail client uses IMAP COPY + DELETE, instead of IMAP MOVE, and no errors are reported. So I think it's related to the IMAP MOVE implementation on Dovecot server.
Has anyone seen the same error? Any suggestions? Is this a Dovecot bug?
Daniele Barresi
On Tue, Dec 27, 2016, at 11:35 AM, Daniele Barresi wrote:
Hello everyone. I have a problem using Dovecot 2.2.26 with ACL plugin and deleting e-mails from a shared mailbox.
My user doesn't have the "expunge" permission on the shared mailbox, but it has the "write-deleted" permission. So, when I delete a message from the shared mailbox using a client that implements the IMAP MOVE command, it tries to move the message to my Trash folder. Then the server closes the connection to the client (process aborted) and I get three lines in the log file with a backtrace and "Fatal" error. In this case the message doesn't get copied or moved from the shared folder and the client complaints. I found the same thing happens whenever I try to move anything between folders of the shared mailbox itself, while logged in with my user. I can move messages inside my own mailbox just fine.
I don't know about the specific errors emitted, but I've encountered the same behavior. As it turns out, the required behavior per RFC 6851 Section 4.2 is that the message cannot be MOVE'd without the expunge permission:
4.2. RFC 4314, Access Control List (ACL)
The ACL rights [RFC4314] required for MOVE and UID MOVE are the union of the ACL rights required for UID STORE, UID COPY, and UID EXPUNGE.
You should be able to get the old behavior back by overriding the CAPABILITY response in the dovecot configuration to exclude "MOVE".
Hope that helps.
V/r, James Cassell
On 12/27/2016 06:35 PM, Daniele Barresi wrote:
Hello everyone. I have a problem using Dovecot 2.2.26 with ACL plugin and deleting e-mails from a shared mailbox.
My user doesn't have the "expunge" permission on the shared mailbox, but it has the "write-deleted" permission. So, when I delete a message from the shared mailbox using a client that implements the IMAP MOVE command, it tries to move the message to my Trash folder. Then the server closes the connection to the client (process aborted) and I get three lines in the log file with a backtrace and "Fatal" error. In this case the message doesn't get copied or moved from the shared folder and the client complaints. I found the same thing happens whenever I try to move anything between folders of the shared mailbox itself, while logged in with my user. I can move messages inside my own mailbox just fine.
If I try the same operation from a client that uses the IMAP COPY + DELETE commands, no errors are logged and the outcome is as expected: the message gets copied from the shared folder to my Trash and gets the flag "\Deleted" set on the shared folder.
My setup is as follows:
Dovecot: 2.2.26.0 OS: Ubuntu 16.04.1 LTS CPU architecture: x86_64 Filesystem: ext4
The relevant lines from mail.err log:
Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Panic: file mail-storage.c: line 2143 (mailbox_save_context_reset): assertion failed: (ctx->copying_via_save) Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Error: Raw backtrace: /usr/lib/dovecot/libdovecot.so.0(+0x9438e) [0x7fbcd478538e] -> /usr/lib/dovecot/libdovecot.so.0(+0x9447c) [0x7fbcd478547c] -> /usr/lib/dovecot/libdovecot.so.0(i_fatal+0) [0x7fbcd471ea4e] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0x41b78) [0x7fbcd4a50b78] -> /usr/lib/dovecot/libdovecot-storage.so.0(mailbox_save_cancel+0x73) [0x7fbcd4a53d73] -> /usr/lib/dovecot/modules/lib01_acl_plugin.so(+0xe142) [0x7fbcd3f1d142] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0x4516d) [0x7fbcd4a5416d] -> /usr/lib/dovecot/libdovecot-storage.so.0(mailbox_move+0x23) [0x7fbcd4a54333] -> dovecot/imap(+0xf9c5) [0x557cf98629c5] -> dovecot/imap(command_exec+0xa6) [0x557cf986f196] -> dovecot/imap(+0x1a4c2) [0x557cf986d4c2] -> dovecot/imap(+0x1a550) [0x557cf986d550] -> dovecot/imap(client_handle_input+0x195) [0x557cf986d915] -> dovecot/imap(client_input+0x85) [0x557cf986de25] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_call_io+0x4c) [0x7fbcd4799bdc] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run_internal+0x10a) [0x7fbcd479b09a] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run+0x25) [0x7fbcd4799c65] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_run+0x38) [0x7fbcd4799e08] -> /usr/lib/dovecot/libdovecot.so.0(master_service_run+0x13) [0x7fbcd4724f53] -> dovecot/imap(main+0x322) [0x557cf9860ca2] -> /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7fbcd4348830] -> dovecot/imap(+0xde1f) [0x557cf9860e1f] Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Fatal: master: service(imap): child 6907 killed with signal 6 (core dumped)
Dovecot configuration (doveadm -n):
# 2.2.26.0 (23d1de6): /etc/dovecot/dovecot.conf # Pigeonhole version 0.4.16 (fed8554) # OS: Linux 4.4.0-57-generic x86_64 Ubuntu 16.04.1 LTS auth_cache_negative_ttl = 10 mins auth_cache_size = 2 M auth_master_user_separator = * auth_mechanisms = plain login first_valid_uid = 12 last_valid_uid = 12 mail_location = maildir:~/Maildir mail_plugins = acl quota notify mail_log stats lazy_expunge 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 namespace casellecondivise { list = children location = maildir:%%h/Maildir:INDEXPVT=~/Maildir/shared/%%u prefix = Caselle condivise/%%u/ separator = / subscriptions = no type = shared } namespace expunged { hidden = yes list = no location = maildir:/var/expunged/%n/Expunged prefix = EXPUNGED/ separator = / } namespace inbox { inbox = yes location = mailbox Archive { auto = subscribe special_use = \Archive } mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } mailbox Sent { auto = subscribe special_use = \Sent } mailbox Trash { auto = subscribe special_use = \Trash } prefix = separator = / type = private } passdb { args = /etc/dovecot/dovecot-ldap.conf.ext driver = ldap } plugin { acl = vfile:/etc/dovecot/global-acls:cache_secs=300 acl_shared_dict = file:/etc/dovecot/shared/shared-mailboxes lazy_expunge = EXPUNGED/ lazy_expunge_only_last_instance = yes mail_log_events = delete copy flag_change save undelete expunge mail_log_fields = uid box msgid size quota = maildir:user quota quota_exceeded_message = (Quota exceeded) La casella di posta elettronica del destinatario è piena. quota_rule = *:storage=1G quota_rule2 = Trash:storage=+100M quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=100%% quota-warning 100 %u sieve = file:~/sieve;active=~/.dovecot.sieve stats_command_min_time = 1 mins stats_domain_min_time = 12 hours stats_ip_min_time = 12 hours stats_memory_limit = 32 M stats_refresh = 30 secs stats_session_min_time = 15 mins stats_track_cmds = yes stats_user_min_time = 1 hours } protocols = " imap sieve" service auth { unix_listener /var/spool/postfix/private/auth { group = mail mode = 0666 user = postfix } unix_listener auth-userdb { group = mail user = mail } } service dict { unix_listener dict { group = mail mode = 0600 user = mail } } service imap-login { process_limit = 300 process_min_avail = 2 } service managesieve-login { inet_listener sieve { port = 4190 } } service quota-warning { executable = script /etc/dovecot/scripts/quota-warning.sh unix_listener quota-warning { group = mail user = mail } } service stats { fifo_listener stats-mail { mode = 0600 user = mail } } ssl = required ssl_cert = </etc/ssl/certs/pac.apg23.org.pem ssl_key = # hidden, use -P to show it userdb { args = /etc/dovecot/dovecot-sql.conf.ext default_fields = uid=mail gid=mail home=/var/mail/%u master_user=%u driver = sql } userdb { args = /etc/dovecot/dovecot-ldap.conf.ext default_fields = uid=mail gid=mail home=/var/mail/%u master_user=%u driver = ldap } protocol lda { mail_plugins = acl quota notify mail_log stats lazy_expunge sieve } protocol imap { mail_max_userip_connections = 25 mail_plugins = acl quota notify mail_log stats lazy_expunge imap_quota imap_stats }
I tested this with different users with the same result. I tested and reproduced the error with Thunderbird and Roundcube. The Apple Mail client uses IMAP COPY + DELETE, instead of IMAP MOVE, and no errors are reported. So I think it's related to the IMAP MOVE implementation on Dovecot server.
Has anyone seen the same error? Any suggestions? Is this a Dovecot bug?
Daniele Barresi Hi!
We'll open a bug on this. Thanks for reporting it.
Aki
On Tue, Jan 3, 2017, at 06:14 PM, Aki Tuomi wrote:
On 12/27/2016 06:35 PM, Daniele Barresi wrote:
Hello everyone. I have a problem using Dovecot 2.2.26 with ACL plugin and deleting e-mails from a shared mailbox.
My user doesn't have the "expunge" permission on the shared mailbox, but it has the "write-deleted" permission. So, when I delete a message from the shared mailbox using a client that implements the IMAP MOVE command, it tries to move the message to my Trash folder. Then the server closes the connection to the client (process aborted) and I get three lines in the log file with a backtrace and "Fatal" error. In this case the message doesn't get copied or moved from the shared folder and the client complaints. I found the same thing happens whenever I try to move anything between folders of the shared mailbox itself, while logged in with my user. I can move messages inside my own mailbox just fine.
If I try the same operation from a client that uses the IMAP COPY + DELETE commands, no errors are logged and the outcome is as expected: the message gets copied from the shared folder to my Trash and gets the flag "\Deleted" set on the shared folder.
My setup is as follows:
Dovecot: 2.2.26.0 OS: Ubuntu 16.04.1 LTS CPU architecture: x86_64 Filesystem: ext4
The relevant lines from mail.err log:
Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Panic: file mail-storage.c: line 2143 (mailbox_save_context_reset): assertion failed: (ctx->copying_via_save) Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Error: Raw backtrace: /usr/lib/dovecot/libdovecot.so.0(+0x9438e) [0x7fbcd478538e] -> /usr/lib/dovecot/libdovecot.so.0(+0x9447c) [0x7fbcd478547c] -> /usr/lib/dovecot/libdovecot.so.0(i_fatal+0) [0x7fbcd471ea4e] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0x41b78) [0x7fbcd4a50b78] -> /usr/lib/dovecot/libdovecot-storage.so.0(mailbox_save_cancel+0x73) [0x7fbcd4a53d73] -> /usr/lib/dovecot/modules/lib01_acl_plugin.so(+0xe142) [0x7fbcd3f1d142] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0x4516d) [0x7fbcd4a5416d] -> /usr/lib/dovecot/libdovecot-storage.so.0(mailbox_move+0x23) [0x7fbcd4a54333] -> dovecot/imap(+0xf9c5) [0x557cf98629c5] -> dovecot/imap(command_exec+0xa6) [0x557cf986f196] -> dovecot/imap(+0x1a4c2) [0x557cf986d4c2] -> dovecot/imap(+0x1a550) [0x557cf986d550] -> dovecot/imap(client_handle_input+0x195) [0x557cf986d915] -> dovecot/imap(client_input+0x85) [0x557cf986de25] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_call_io+0x4c) [0x7fbcd4799bdc] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run_internal+0x10a) [0x7fbcd479b09a] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run+0x25) [0x7fbcd4799c65] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_run+0x38) [0x7fbcd4799e08] -> /usr/lib/dovecot/libdovecot.so.0(master_service_run+0x13) [0x7fbcd4724f53] -> dovecot/imap(main+0x322) [0x557cf9860ca2] -> /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7fbcd4348830] -> dovecot/imap(+0xde1f) [0x557cf9860e1f] Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Fatal: master: service(imap): child 6907 killed with signal 6 (core dumped)
Dovecot configuration (doveadm -n):
# 2.2.26.0 (23d1de6): /etc/dovecot/dovecot.conf # Pigeonhole version 0.4.16 (fed8554) # OS: Linux 4.4.0-57-generic x86_64 Ubuntu 16.04.1 LTS auth_cache_negative_ttl = 10 mins auth_cache_size = 2 M auth_master_user_separator = * auth_mechanisms = plain login first_valid_uid = 12 last_valid_uid = 12 mail_location = maildir:~/Maildir mail_plugins = acl quota notify mail_log stats lazy_expunge 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 namespace casellecondivise { list = children location = maildir:%%h/Maildir:INDEXPVT=~/Maildir/shared/%%u prefix = Caselle condivise/%%u/ separator = / subscriptions = no type = shared } namespace expunged { hidden = yes list = no location = maildir:/var/expunged/%n/Expunged prefix = EXPUNGED/ separator = / } namespace inbox { inbox = yes location = mailbox Archive { auto = subscribe special_use = \Archive } mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } mailbox Sent { auto = subscribe special_use = \Sent } mailbox Trash { auto = subscribe special_use = \Trash } prefix = separator = / type = private } passdb { args = /etc/dovecot/dovecot-ldap.conf.ext driver = ldap } plugin { acl = vfile:/etc/dovecot/global-acls:cache_secs=300 acl_shared_dict = file:/etc/dovecot/shared/shared-mailboxes lazy_expunge = EXPUNGED/ lazy_expunge_only_last_instance = yes mail_log_events = delete copy flag_change save undelete expunge mail_log_fields = uid box msgid size quota = maildir:user quota quota_exceeded_message = (Quota exceeded) La casella di posta elettronica del destinatario è piena. quota_rule = *:storage=1G quota_rule2 = Trash:storage=+100M quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=100%% quota-warning 100 %u sieve = file:~/sieve;active=~/.dovecot.sieve stats_command_min_time = 1 mins stats_domain_min_time = 12 hours stats_ip_min_time = 12 hours stats_memory_limit = 32 M stats_refresh = 30 secs stats_session_min_time = 15 mins stats_track_cmds = yes stats_user_min_time = 1 hours } protocols = " imap sieve" service auth { unix_listener /var/spool/postfix/private/auth { group = mail mode = 0666 user = postfix } unix_listener auth-userdb { group = mail user = mail } } service dict { unix_listener dict { group = mail mode = 0600 user = mail } } service imap-login { process_limit = 300 process_min_avail = 2 } service managesieve-login { inet_listener sieve { port = 4190 } } service quota-warning { executable = script /etc/dovecot/scripts/quota-warning.sh unix_listener quota-warning { group = mail user = mail } } service stats { fifo_listener stats-mail { mode = 0600 user = mail } } ssl = required ssl_cert = </etc/ssl/certs/pac.apg23.org.pem ssl_key = # hidden, use -P to show it userdb { args = /etc/dovecot/dovecot-sql.conf.ext default_fields = uid=mail gid=mail home=/var/mail/%u master_user=%u driver = sql } userdb { args = /etc/dovecot/dovecot-ldap.conf.ext default_fields = uid=mail gid=mail home=/var/mail/%u master_user=%u driver = ldap } protocol lda { mail_plugins = acl quota notify mail_log stats lazy_expunge sieve } protocol imap { mail_max_userip_connections = 25 mail_plugins = acl quota notify mail_log stats lazy_expunge imap_quota imap_stats }
I tested this with different users with the same result. I tested and reproduced the error with Thunderbird and Roundcube. The Apple Mail client uses IMAP COPY + DELETE, instead of IMAP MOVE, and no errors are reported. So I think it's related to the IMAP MOVE implementation on Dovecot server.
Has anyone seen the same error? Any suggestions? Is this a Dovecot bug?
Daniele Barresi Hi!
We'll open a bug on this. Thanks for reporting it.
Aki
Hello,
I'm also seeing this error on Dovecot 2.2.27 from Debian jessie-backports. The error seems to come up when trying to move FROM a folder for which the user doesn't have the EXPUNGE ACL. It doesn't have to be a shared folder (and in my case, it is not a shared folder.) My workaround is to not advertise the MOVE capability, but long-term, it's better to fix the crash.
V/r, James Cassell
On May 30, 2017 at 6:03 PM James Cassell <fedoraproject@cyberpear.com> wrote:
On Tue, Jan 3, 2017, at 06:14 PM, Aki Tuomi wrote:
On 12/27/2016 06:35 PM, Daniele Barresi wrote:
Hello everyone. I have a problem using Dovecot 2.2.26 with ACL plugin and deleting e-mails from a shared mailbox.
My user doesn't have the "expunge" permission on the shared mailbox, but it has the "write-deleted" permission. So, when I delete a message from the shared mailbox using a client that implements the IMAP MOVE command, it tries to move the message to my Trash folder. Then the server closes the connection to the client (process aborted) and I get three lines in the log file with a backtrace and "Fatal" error. In this case the message doesn't get copied or moved from the shared folder and the client complaints. I found the same thing happens whenever I try to move anything between folders of the shared mailbox itself, while logged in with my user. I can move messages inside my own mailbox just fine.
If I try the same operation from a client that uses the IMAP COPY + DELETE commands, no errors are logged and the outcome is as expected: the message gets copied from the shared folder to my Trash and gets the flag "\Deleted" set on the shared folder.
My setup is as follows:
Dovecot: 2.2.26.0 OS: Ubuntu 16.04.1 LTS CPU architecture: x86_64 Filesystem: ext4
The relevant lines from mail.err log:
Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Panic: file mail-storage.c: line 2143 (mailbox_save_context_reset): assertion failed: (ctx->copying_via_save) Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Error: Raw backtrace: /usr/lib/dovecot/libdovecot.so.0(+0x9438e) [0x7fbcd478538e] -> /usr/lib/dovecot/libdovecot.so.0(+0x9447c) [0x7fbcd478547c] -> /usr/lib/dovecot/libdovecot.so.0(i_fatal+0) [0x7fbcd471ea4e] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0x41b78) [0x7fbcd4a50b78] -> /usr/lib/dovecot/libdovecot-storage.so.0(mailbox_save_cancel+0x73) [0x7fbcd4a53d73] -> /usr/lib/dovecot/modules/lib01_acl_plugin.so(+0xe142) [0x7fbcd3f1d142] -> /usr/lib/dovecot/libdovecot-storage.so.0(+0x4516d) [0x7fbcd4a5416d] -> /usr/lib/dovecot/libdovecot-storage.so.0(mailbox_move+0x23) [0x7fbcd4a54333] -> dovecot/imap(+0xf9c5) [0x557cf98629c5] -> dovecot/imap(command_exec+0xa6) [0x557cf986f196] -> dovecot/imap(+0x1a4c2) [0x557cf986d4c2] -> dovecot/imap(+0x1a550) [0x557cf986d550] -> dovecot/imap(client_handle_input+0x195) [0x557cf986d915] -> dovecot/imap(client_input+0x85) [0x557cf986de25] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_call_io+0x4c) [0x7fbcd4799bdc] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run_internal+0x10a) [0x7fbcd479b09a] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_handler_run+0x25) [0x7fbcd4799c65] -> /usr/lib/dovecot/libdovecot.so.0(io_loop_run+0x38) [0x7fbcd4799e08] -> /usr/lib/dovecot/libdovecot.so.0(master_service_run+0x13) [0x7fbcd4724f53] -> dovecot/imap(main+0x322) [0x557cf9860ca2] -> /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7fbcd4348830] -> dovecot/imap(+0xde1f) [0x557cf9860e1f] Dec 27 15:21:18 dovecot dovecot: imap(danielebarresi): Fatal: master: service(imap): child 6907 killed with signal 6 (core dumped)
Dovecot configuration (doveadm -n):
# 2.2.26.0 (23d1de6): /etc/dovecot/dovecot.conf # Pigeonhole version 0.4.16 (fed8554) # OS: Linux 4.4.0-57-generic x86_64 Ubuntu 16.04.1 LTS auth_cache_negative_ttl = 10 mins auth_cache_size = 2 M auth_master_user_separator = * auth_mechanisms = plain login first_valid_uid = 12 last_valid_uid = 12 mail_location = maildir:~/Maildir mail_plugins = acl quota notify mail_log stats lazy_expunge 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 namespace casellecondivise { list = children location = maildir:%%h/Maildir:INDEXPVT=~/Maildir/shared/%%u prefix = Caselle condivise/%%u/ separator = / subscriptions = no type = shared } namespace expunged { hidden = yes list = no location = maildir:/var/expunged/%n/Expunged prefix = EXPUNGED/ separator = / } namespace inbox { inbox = yes location = mailbox Archive { auto = subscribe special_use = \Archive } mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } mailbox Sent { auto = subscribe special_use = \Sent } mailbox Trash { auto = subscribe special_use = \Trash } prefix = separator = / type = private } passdb { args = /etc/dovecot/dovecot-ldap.conf.ext driver = ldap } plugin { acl = vfile:/etc/dovecot/global-acls:cache_secs=300 acl_shared_dict = file:/etc/dovecot/shared/shared-mailboxes lazy_expunge = EXPUNGED/ lazy_expunge_only_last_instance = yes mail_log_events = delete copy flag_change save undelete expunge mail_log_fields = uid box msgid size quota = maildir:user quota quota_exceeded_message = (Quota exceeded) La casella di posta elettronica del destinatario è piena. quota_rule = *:storage=1G quota_rule2 = Trash:storage=+100M quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=100%% quota-warning 100 %u sieve = file:~/sieve;active=~/.dovecot.sieve stats_command_min_time = 1 mins stats_domain_min_time = 12 hours stats_ip_min_time = 12 hours stats_memory_limit = 32 M stats_refresh = 30 secs stats_session_min_time = 15 mins stats_track_cmds = yes stats_user_min_time = 1 hours } protocols = " imap sieve" service auth { unix_listener /var/spool/postfix/private/auth { group = mail mode = 0666 user = postfix } unix_listener auth-userdb { group = mail user = mail } } service dict { unix_listener dict { group = mail mode = 0600 user = mail } } service imap-login { process_limit = 300 process_min_avail = 2 } service managesieve-login { inet_listener sieve { port = 4190 } } service quota-warning { executable = script /etc/dovecot/scripts/quota-warning.sh unix_listener quota-warning { group = mail user = mail } } service stats { fifo_listener stats-mail { mode = 0600 user = mail } } ssl = required ssl_cert = </etc/ssl/certs/pac.apg23.org.pem ssl_key = # hidden, use -P to show it userdb { args = /etc/dovecot/dovecot-sql.conf.ext default_fields = uid=mail gid=mail home=/var/mail/%u master_user=%u driver = sql } userdb { args = /etc/dovecot/dovecot-ldap.conf.ext default_fields = uid=mail gid=mail home=/var/mail/%u master_user=%u driver = ldap } protocol lda { mail_plugins = acl quota notify mail_log stats lazy_expunge sieve } protocol imap { mail_max_userip_connections = 25 mail_plugins = acl quota notify mail_log stats lazy_expunge imap_quota imap_stats }
I tested this with different users with the same result. I tested and reproduced the error with Thunderbird and Roundcube. The Apple Mail client uses IMAP COPY + DELETE, instead of IMAP MOVE, and no errors are reported. So I think it's related to the IMAP MOVE implementation on Dovecot server.
Has anyone seen the same error? Any suggestions? Is this a Dovecot bug?
Daniele Barresi Hi!
We'll open a bug on this. Thanks for reporting it.
Aki
Hello,
I'm also seeing this error on Dovecot 2.2.27 from Debian jessie-backports. The error seems to come up when trying to move FROM a folder for which the user doesn't have the EXPUNGE ACL. It doesn't have to be a shared folder (and in my case, it is not a shared folder.) My workaround is to not advertise the MOVE capability, but long-term, it's better to fix the crash.
V/r, James Cassell
Hi!
This bug has been fixed in 2.2.28.
https://github.com/dovecot/core/commit/2c6a1ceeddee48ff682bbedaa2567d0429cd1...
Aki
participants (3)
-
Aki Tuomi
-
Daniele Barresi
-
James Cassell