On 2021-01-24, Stuart Henderson <stu@spacehopper.org> wrote:
I'm seeing this on some mailboxes with 2.13 on OpenBSD amd64 (recent snapshot):
dovecot: imap(sthen)<47220><ARy1oKS5lWDDX7sa>: Panic: file istream.c: line 332 (i_stream_read_memarea): assertion failed: (!stream->blocking)
Using sieve, imapsieve, replicator, zlib (zlib_save = lz4 and has been for some time, so the relevant messages probably use this). Using mmap_disable because OpenBSD.
Any suggestions how to handle it, preferably automatically? (even if a message is corrupt/lost it would be really nice if a standard client could still access the mailbox rather than kill the imap process while reading headers).
Thought I'd try doveadm force-resync ("For sdbox and mdbox mailboxes the storage files will be also checked") but this doesn't help.
Getting some ideas for the seemingly related thread about zstd/xz https://dovecot.org/pipermail/dovecot/2020-September/119890.html I've had a play with doveadm fetch.
Doing 'doveadm fetch -u sthen "uid text" mailbox ports | grep ^uid | tail' I find various messages from around June/July 2020 that trigger the crash. Expunging the last displayed uid at that point I get further but I run into more after a few messages. I don't mind doing that with this mailbox to get things working but if it can be used to provide/test something more robust that would be better.
Using "doveadm -o mail_plugins=virtual fetch" I see that they're definitely lz4 compressed.
Seems odd but if I do text fetches by uid I don't run into any failure?
$ for i in cat /tmp/uid.p|cut -d: -f2
;do doveadm fetch -u sthen text mailbox ports uid $i > /dev/null || echo $i;done
[no output]
Any ideas?
bt first for ease of reading, followed by bt full in case it has any additional clues.
(gdb) bt #0 thrkill () at /tmp/-:3 #1 0x00000e9158c7c3ae in _libc_abort () at /usr/src/lib/libc/stdlib/abort.c:51 #2 0x00000e91adc00c26 in default_fatal_finish (type=LOG_TYPE_PANIC, status=0) at failures.c:459 #3 0x00000e91adbff034 in fatal_handler_real (ctx=0x7f7ffffcdd90, format=<optimized out>, args=<optimized out>) at failures.c:471 #4 0x00000e91adbfffb1 in i_internal_fatal_handler (ctx=0x0, format=0x6 <error: Cannot access memory at address 0x6>, args=0x0) at failures.c:866 #5 0x00000e91adbff266 in i_panic (format=0x6 <error: Cannot access memory at address 0x6>) at failures.c:523 #6 0x00000e91adc0f15c in i_stream_read_memarea (stream=0xe917ead3480) at istream.c:332 #7 0x00000e91adc1925f in read_more (sstream=0xe91431c4800) at istream-seekable.c:149 #8 0x00000e91adc19090 in read_from_buffer (sstream=0xe91431c4800, ret_r=0x7f7ffffcded8) at istream-seekable.c:204 #9 0x00000e91adc1856d in i_stream_seekable_read (stream=0xe91431c4800) at istream-seekable.c:265 #10 0x00000e91adc0f0a4 in i_stream_read_memarea (stream=0xe91431c4880) at istream.c:313 #11 0x00000e91adc16bbc in i_stream_limit_read (stream=0xe91e9ccca00) at istream-limit.c:49 #12 0x00000e91adc0f0a4 in i_stream_read_memarea (stream=0xe91e9ccca80) at istream.c:313 #13 0x00000e91adc0f79c in i_stream_read_copy_from_parent (istream=<optimized out>) at istream.c:387 #14 0x00000e918e9729fa in i_stream_mail_read (stream=0xe91e9ccc000) at istream-mail.c:115 #15 0x00000e91adc0f0a4 in i_stream_read_memarea (stream=0xe91e9ccc080) at istream.c:313 #16 0x00000e91adc104f5 in i_stream_read (stream=0xe91e9ccc080) at istream.c:271 #17 i_stream_read_data (stream=0xe91e9ccc080, data_r=0x7f7ffffce110, size_r=0x7f7ffffce100, threshold=1) at istream.c:747 #18 0x00000e91adbd6a18 in i_stream_read_bytes (stream=0x0, data_r=<optimized out>, size_r=<optimized out>, wanted=<optimized out>) at ../../src/lib/istream.h:214 #19 message_parse_header_next (ctx=0xe9183e1b180, hdr_r=0x7f7ffffce1d0) at message-header-parser.c:85 #20 0x00000e91adbceef2 in read_header (mstream=0xe91e9cc6000) at istream-header-filter.c:195 #21 i_stream_header_filter_read (stream=0xe91e9cc6000) at istream-header-filter.c:450 #22 0x00000e91adc0f0a4 in i_stream_read_memarea (stream=0xe91e9cc6080) at istream.c:313 #23 0x00000e91adc104f5 in i_stream_read (stream=0xe91e9cc6080) at istream.c:271 #24 i_stream_read_data (stream=0xe91e9cc6080, data_r=0x7f7ffffce2c0, size_r=0x7f7ffffce2c8, threshold=0) at istream.c:747 #25 0x00000e91adbdc07b in i_stream_read_bytes (stream=0xe91e9cc6080, data_r=<optimized out>, size_r=<optimized out>, wanted=<error reading variable: Cannot access memory at address 0x1>) at ../../src/lib/istream.h:214 #26 message_get_header_size (input=0xe91e9cc6080, hdr=0x7f7ffffce328, has_nuls_r=0x7f7ffffce3b7) at message-size.c:19 #27 0x00000e8f25e767d9 in imap_msgpart_get_partial_header (mail=0xe91e9cc4848, mail_input=<optimized out>, msgpart=0xe91c92a2048, virtual_size_r=<optimized out>, result_r=0x7f7ffffce408, have_crlfs_r=<optimized out>) at imap-msgpart.c:401 #28 imap_msgpart_open_normal (mail=<optimized out>, msgpart=0xe91c92a2048, part=<optimized out>, virtual_size_r=<optimized out>, result_r=0x7f7ffffce408, have_crlfs_r=<optimized out>) at imap-msgpart.c:637 #29 imap_msgpart_open (mail=<optimized out>, msgpart=0xe91c92a2048, result_r=0x7f7ffffce408) at imap-msgpart.c:706 #30 0x00000e8f25e672ff in fetch_body_msgpart (ctx=0xe9159845368, mail=<optimized out>, body=0xe91e9cb4398) at imap-fetch-body.c:184 #31 0x00000e8f25e65837 in imap_fetch_more_int (ctx=0xe9159845368, cancel=false) at imap-fetch.c:562 #32 0x00000e8f25e6552c in imap_fetch_more (ctx=0xe9159845368, cmd=0xe9159845048) at imap-fetch.c:617 #33 0x00000e8f25e55521 in cmd_fetch (cmd=0xe9159845048) at cmd-fetch.c:337 #34 0x00000e8f25e62d12 in command_exec (cmd=0xe9159845048) at imap-commands.c:201 #35 0x00000e8f25e61576 in client_command_input (cmd=0xe9159845048) at imap-client.c:1204 #36 0x00000e8f25e61682 in client_command_input (cmd=0xe9159845048) at imap-client.c:1269 #37 0x00000e8f25e5ffb4 in client_handle_next_command (client=0xe9159845848, remove_io_r=<optimized out>) at imap-client.c:1313 #38 client_handle_input (client=0xe9159845848) at imap-client.c:1327 #39 0x00000e8f25e5e755 in client_input (client=0xe9159845848) at imap-client.c:1371 #40 0x00000e91adc1c851 in io_loop_call_io (io=0xe91eb5d0b00) at ioloop.c:714 #41 0x00000e91adc1f84c in io_loop_handler_run_internal (ioloop=0xe9162373d00) at ioloop-kqueue.c:164 #42 0x00000e91adc1cfd9 in io_loop_handler_run (ioloop=0xe9162373d00) at ioloop.c:766 #43 0x00000e91adc1cce8 in io_loop_run (ioloop=0xe9162373d00) at ioloop.c:739 #44 0x00000e91adb77655 in master_service_run (service=0xe9193c39600, callback=0x6) at master-service.c:853 #45 0x00000e8f25e70dd1 in main (argc=1, argv=<optimized out>) at main.c:532
(gdb) bt full #0 thrkill () at /tmp/-:3 No locals. #1 0x00000e9158c7c3ae in _libc_abort () at /usr/src/lib/libc/stdlib/abort.c:51 sa = { __sigaction_u = { __sa_handler = 0x0, __sa_sigaction = 0x0 }, sa_mask = 4294967295, sa_flags = 0 } mask = 4294967263 #2 0x00000e91adc00c26 in default_fatal_finish (type=LOG_TYPE_PANIC, status=0) at failures.c:459 recursed = 0 backtrace = <optimized out> #3 0x00000e91adbff034 in fatal_handler_real (ctx=0x7f7ffffcdd90, format=<optimized out>, args=<optimized out>) at failures.c:471 status = 6 #4 0x00000e91adbfffb1 in i_internal_fatal_handler (ctx=0x0, format=0x6 <error: Cannot access memory at address 0x6>, args=0x0) at failures.c:866 No locals. #5 0x00000e91adbff266 in i_panic (format=0x6 <error: Cannot access memory at address 0x6>) at failures.c:523 ctx = { type = LOG_TYPE_PANIC, exit_status = 0, timestamp = 0x0, timestamp_usecs = 0, log_prefix = 0x0, log_prefix_type_pos = 0 } args = {{ gp_offset = 40, fp_offset = 48, overflow_arg_area = 0x7f7ffffcddf0, reg_save_area = 0x7f7ffffcdce0 }} #6 0x00000e91adc0f15c in i_stream_read_memarea (stream=0xe917ead3480) at istream.c:332 _stream = 0xe917ead3400 old_size = 0 ret = 0 #7 0x00000e91adc1925f in read_more (sstream=0xe91431c4800) at istream-seekable.c:149 ret = <optimized out> size = <optimized out> #8 0x00000e91adc19090 in read_from_buffer (sstream=0xe91431c4800, ret_r=0x7f7ffffcded8) at istream-seekable.c:204 old_skip = <optimized out> stream = 0xe91431c4800 size = <optimized out> data = <optimized out> avail_size = <optimized out> #9 0x00000e91adc1856d in i_stream_seekable_read (stream=0xe91431c4800) at istream-seekable.c:265 sstream = 0xe91431c4800 ret = 16019855444480 size = <optimized out> data = <optimized out> pos = <optimized out> #10 0x00000e91adc0f0a4 in i_stream_read_memarea (stream=0xe91431c4880) at istream.c:313 _stream = 0xe91431c4800 old_size = 0 ret = <optimized out> #11 0x00000e91adc16bbc in i_stream_limit_read (stream=0xe91e9ccca00) at istream-limit.c:49 lstream = 0xe91e9ccca00 pos = 16017421909770 ret = <optimized out> left = <optimized out> #12 0x00000e91adc0f0a4 in i_stream_read_memarea (stream=0xe91e9ccca80) at istream.c:313 _stream = 0xe91e9ccca00 old_size = 0 ret = <optimized out> #13 0x00000e91adc0f79c in i_stream_read_copy_from_parent (istream=<optimized out>) at istream.c:387 stream = 0xe91e9ccc000 pos = <optimized out> ret = <optimized out> #14 0x00000e918e9729fa in i_stream_mail_read (stream=0xe91e9ccc000) at istream-mail.c:115 mstream = 0xe91e9ccc000 ret = <optimized out> size = <optimized out> #15 0x00000e91adc0f0a4 in i_stream_read_memarea (stream=0xe91e9ccc080) at istream.c:313 _stream = 0xe91e9ccc000 old_size = 0 ret = <optimized out> #16 0x00000e91adc104f5 in i_stream_read (stream=0xe91e9ccc080) at istream.c:271 _stream = 0xe91e9ccc000 ret = <optimized out> #17 i_stream_read_data (stream=0xe91e9ccc080, data_r=0x7f7ffffce110, size_r=0x7f7ffffce100, threshold=1) at istream.c:747 read_more = false ret = <error reading variable ret (Cannot access memory at address 0x0)> #18 0x00000e91adbd6a18 in i_stream_read_bytes (stream=0x0, data_r=<optimized out>, size_r=<optimized out>, wanted=<optimized out>) at ../../src/lib/istream.h:214 No locals. #19 message_parse_header_next (ctx=0xe9183e1b180, hdr_r=0x7f7ffffce1d0) at message-header-parser.c:85 skip = <error reading variable skip (Cannot access memory at address 0x0)> line = 0xe9183e1b180 colon_pos = 4294967295 no_newline = <error reading variable no_newline (Cannot access memory at address 0x0)> crlf_newline = <error reading variable crlf_newline (Cannot access memory at address 0x0)> continued = false size = 0 msg = 0xe91adafee50 <uchar_nul> "" startpos = 0 continues = <error reading variable continues (Cannot access memory at address 0x0)> i = <optimized out> parse_size = <optimized out> ret = <optimized out> last_crlf = <optimized out> last_no_newline = <optimized out> #20 0x00000e91adbceef2 in read_header (mstream=0xe91e9cc6000) at istream-header-filter.c:195 highwater_offset = <optimized out> max_buffer_size = 8192 hdr = 0x0 hdr_ret = <optimized out> ret = <optimized out> ret2 = <optimized out> #21 i_stream_header_filter_read (stream=0xe91e9cc6000) at istream-header-filter.c:450 mstream = 0xe91e9cc6000 v_offset = <optimized out> ret = <optimized out> #22 0x00000e91adc0f0a4 in i_stream_read_memarea (stream=0xe91e9cc6080) at istream.c:313 _stream = 0xe91e9cc6000 old_size = 0 ret = <optimized out> #23 0x00000e91adc104f5 in i_stream_read (stream=0xe91e9cc6080) at istream.c:271 _stream = 0xe91e9cc6000 ret = <optimized out> #24 i_stream_read_data (stream=0xe91e9cc6080, data_r=0x7f7ffffce2c0, size_r=0x7f7ffffce2c8, threshold=0) at istream.c:747 read_more = false ret = <error reading variable ret (Cannot access memory at address 0x0)> #25 0x00000e91adbdc07b in i_stream_read_bytes (stream=0xe91e9cc6080, data_r=<optimized out>, size_r=<optimized out>, wanted=<error reading variable: Cannot access memory at address 0x1>) at ../../src/lib/istream.h:214 No locals. #26 message_get_header_size (input=0xe91e9cc6080, hdr=0x7f7ffffce328, has_nuls_r=0x7f7ffffce3b7) at message-size.c:19 size = 0 msg = 0xe91adafee50 <uchar_nul> "" startpos = <error reading variable startpos (Cannot access memory at address 0x0)> missing_cr_count = <error reading variable missing_cr_count (Cannot access memory at address 0x0)> ret = <optimized out> i = <optimized out> #27 0x00000e8f25e767d9 in imap_msgpart_get_partial_header (mail=0xe91e9cc4848, mail_input=<optimized out>, msgpart=0xe91c92a2048, virtual_size_r=<optimized out>, result_r=0x7f7ffffce408, have_crlfs_r=<optimized out>) at imap-msgpart.c:401 hdr_size = { physical_size = 0, virtual_size = 0, lines = 0 } hdr_fields = 0xe91c92a21f8 hdr_count = <optimized out> input = 0xe91e9cc6080 has_nuls = false #28 imap_msgpart_open_normal (mail=<optimized out>, msgpart=0xe91c92a2048, part=<optimized out>, virtual_size_r=<optimized out>, result_r=0x7f7ffffce408, have_crlfs_r=<optimized out>) at imap-msgpart.c:637 hdr_size = { physical_size = 0, virtual_size = 0, lines = 0 } body_size = { physical_size = 0, virtual_size = 0, lines = 0 } input = <optimized out> unknown_crlfs = <error reading variable unknown_crlfs (Cannot access memory at address 0x0)> part_size = <error reading variable part_size (Cannot access memory at address 0x0)> #29 imap_msgpart_open (mail=<optimized out>, msgpart=0xe91c92a2048, result_r=0x7f7ffffce408) at imap-msgpart.c:706 part = <optimized out> ret = <optimized out> virtual_size = 1 binary = <optimized out> have_crlfs = <optimized out> #30 0x00000e8f25e672ff in fetch_body_msgpart (ctx=0xe9159845368, mail=<optimized out>, body=0xe91e9cb4398) at imap-fetch-body.c:184 result = { input = 0x0, size = 0, size_field = (unknown: 0), binary_decoded_input_has_nuls = false } str = <optimized out> #31 0x00000e8f25e65837 in imap_fetch_more_int (ctx=0xe9159845368, cancel=false) at imap-fetch.c:562 _data_stack_cur_id = <optimized out> client = <optimized out> ret = <optimized out> handlers = 0xe91e9cb4020 count = 5 #32 0x00000e8f25e6552c in imap_fetch_more (ctx=0xe9159845368, cmd=0xe9159845048) at imap-fetch.c:617 ret = <optimized out> #33 0x00000e8f25e55521 in cmd_fetch (cmd=0xe9159845048) at cmd-fetch.c:337 qresync_args = { qresync_sample_seqset = 0xe9159845368, qresync_sample_uidset = 0xe9159845020 } args = <optimized out> send_vanished = <optimized out> client = 0xe9159845848 messageset = <optimized out> search_args = 0x0 ret = <optimized out> ctx = 0x0 next_arg = <optimized out> list_arg = <optimized out> #34 0x00000e8f25e62d12 in command_exec (cmd=0xe9159845048) at imap-commands.c:201 hook = <optimized out> #35 0x00000e8f25e61576 in client_command_input (cmd=0xe9159845048) at imap-client.c:1204 client = 0xe9159845848 command = <optimized out> tag = <optimized out> ret = <optimized out> name = <optimized out> #36 0x00000e8f25e61682 in client_command_input (cmd=0xe9159845048) at imap-client.c:1269 client = 0xe9159845848 command = <optimized out> tag = <optimized out> ret = <optimized out> name = <optimized out> #37 0x00000e8f25e5ffb4 in client_handle_next_command (client=0xe9159845848, remove_io_r=<optimized out>) at imap-client.c:1313 No locals. #38 client_handle_input (client=0xe9159845848) at imap-client.c:1327 _data_stack_cur_id = <optimized out> handled_commands = false ret = <optimized out> remove_io = <optimized out> #39 0x00000e8f25e5e755 in client_input (client=0xe9159845848) at imap-client.c:1371 output = 0xe92088000a0 bytes = 218 cmd = <optimized out> #40 0x00000e91adc1c851 in io_loop_call_io (io=0xe91eb5d0b00) at ioloop.c:714 ioloop = 0xe9162373d00 t_id = 0 #41 0x00000e91adc1f84c in io_loop_handler_run_internal (ioloop=0xe9162373d00) at ioloop-kqueue.c:164 tv = { tv_sec = 3, tv_usec = 410626 } ts = { tv_sec = 3, tv_nsec = 410626000 } ctx = 0xe9171193980 msecs = <optimized out> events_count = <optimized out> events = <optimized out> ret = <optimized out> i = <optimized out> io = 0xe91eb5d0b00 #42 0x00000e91adc1cfd9 in io_loop_handler_run (ioloop=0xe9162373d00) at ioloop.c:766 No locals. #43 0x00000e91adc1cce8 in io_loop_run (ioloop=0xe9162373d00) at ioloop.c:739 No locals. #44 0x00000e91adb77655 in master_service_run (service=0xe9193c39600, callback=0x6) at master-service.c:853 No locals. #45 0x00000e8f25e70dd1 in main (argc=1, argv=<optimized out>) at main.c:532 set_roots = {0xe91adc66270 <smtp_submit_setting_parser_info>, 0xe8f25e7e310 <imap_setting_parser_info>, 0x0} login_set = { auth_socket_path = 0xe9136774490 "HEADER.FIELDS (DATE FROM SENDER SUBJECT TO CC MESSAGE-ID REFERENCES CONTENT-TYPE CONTENT-DESCRIPTION IN-REPLY-TO REPLY-TO LINES LIST-POST X-LABEL)", postlogin_socket_path = 0x0, postlogin_timeout_secs = 60, callback = 0xe8f25e70fc0 <login_client_connected>, failure_callback = 0xe8f25e712b0 <login_client_failed>, request_auth_token = true } username = <optimized out> storage_service_flags = <optimized out> service_flags = <optimized out> auth_socket_path = <optimized out> c = <optimized out> error = 0x7f7ffffcea18 "]\353\374\377\177\177" (gdb)