Dear Maintainer,
tried to get some more information out of the 
kernel segfault line, until a backtrace or core
gets delivered...

For the lines with "ip .............90e" I guess
it could be related to these functions:

  array_append_array_i
  mailbox_uidset_change
  mail_search_arg_init

It might be that we hit following line with
dest_array or src_array containing a null pointer.

  array.h:193          i_assert(dest_array->element_size == 
src_array->element_size);

Then we would get such a segfault instead
of the assert message.
But sure, the problem behind needs more context.

Kind regards,
Bernhard
# Stretch amd64 qemu VM 2019-03-29

apt update
apt dist-upgrade



apt install devscripts dpkg-dev mc systemd-coredump 
dovecot-imapd=1:2.3.4.1-1~bpo9+1 gdb


wget 
https://snapshot.debian.org/archive/debian-debug/20190222T150352Z/pool/main/d/dovecot/dovecot-imapd-dbgsym_2.3.4.1-1%7Ebpo9%2B1_amd64.deb
wget 
https://snapshot.debian.org/archive/debian-debug/20190222T150352Z/pool/main/d/dovecot/dovecot-core-dbgsym_2.3.4.1-1%7Ebpo9%2B1_amd64.deb
dpkg -i dovecot-imapd-dbgsym_2.3.4.1-1~bpo9+1_amd64.deb 
dovecot-core-dbgsym_2.3.4.1-1~bpo9+1_amd64.deb



mkdir /home/benutzer/source/dovecot/orig -p
cd    /home/benutzer/source/dovecot/orig
dget 
https://snapshot.debian.org/archive/debian-debug/20190222T150352Z/pool/main/d/dovecot/dovecot_2.3.4.1-1%7Ebpo9%2B1.dsc
cd




############


From submitter:
    kernel: [1691560.449117] imap[8380]: segfault at 8 ip 00007fea0c1c890e sp 
00007ffdc7607150 error 4 in libdovecot-storage.so.0.0.0[7fea0c10d000+12c000]



https://www.enodev.fr/posts/decode-segfault-errors-in-dmesg.html
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/x86/mm/fault.c?h=linux-4.9.y#n31


/*
 * Page fault error code bits:
 *
 *   bit 0 ==<-> 0: no page found<----->1: protection fault
 *   bit 1 ==<-> 0: read access><------>1: write access
 *   bit 2 ==<-> 0: kernel-mode access<>1: user-mode access
 *   bit 3 ==<-><------><------><------>1: use of reserved bit detected
 *   bit 4 ==<-><------><------><------>1: fault was an instruction fetch
 *   bit 5 ==<-><------><------><------>1: protection keys block access
 */
enum x86_pf_error_code {

<------>PF_PROT><------>=<-----><------>1 << 0,
<------>PF_WRITE<------>=<-----><------>1 << 1,
<------>PF_USER><------>=<-----><------>1 << 2,
<------>PF_RSVD><------>=<-----><------>1 << 3,
<------>PF_INSTR<------>=<-----><------>1 << 4,
<------>PF_PK<-><------>=<-----><------>1 << 5,
};


"error 4" == 0b100

bit 0 ==<------> 0: no page found
bit 1 ==<------> 0: read access
bit 2 ==<------> 1: user-mode access



#############



script -c "gdb -q -ex 'set width 0' -ex 'set pagination off' -ex 'b main' -ex 
'run' --args /usr/lib/dovecot/imap" -a gdb_$(date +%Y-%m-%d_%H-%M-%S).log

info share
disassemble 0x00007ffff7ac15c0,0x00007ffff7b8599e
kill
q



root@debian:~# grep "90e " gdb_2019-03-29_23-29-10.log | grep "0x8("
   0x00007ffff7ac690e <mail_search_arg_init+302>:       mov    0x8(%r12),%rax
   0x00007ffff7ae390e <shared_list_iter_init+30>:       mov    %rsi,0x8(%rsp)
   0x00007ffff7b6890e <mail_index_strmap_view_sync_commit+1022>:        mov    
%esi,0x8(%rdi)

--> Could be the first line - as the second and third are writes



#############


gdb -q --args /usr/lib/dovecot/imap

set width 0
set pagination off
b main
directory /home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/imap
directory /home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/lib-storage
directory /home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/lib
run


root@debian:~# gdb -q --args /usr/lib/dovecot/imap
Reading symbols from /usr/lib/dovecot/imap...Reading symbols from 
/usr/lib/debug/.build-id/18/305c1d9a040a3941346dc9a9a34a0839fc3bf0.debug...done.
done.
(gdb) set width 0
(gdb) set pagination off
(gdb) b main
Breakpoint 1 at 0xd510: file main.c, line 416.
(gdb) directory /home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/imap
Source directories searched: 
/home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/imap:$cdir:$cwd
(gdb) directory 
/home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/lib-storage
Source directories searched: 
/home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/lib-storage:/home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/imap:$cdir:$cwd
(gdb) directory /home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/lib
Source directories searched: 
/home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/lib:/home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/lib-storage:/home/benutzer/source/dovecot/orig/dovecot-2.3.4.1/src/imap:$cdir:$cwd
(gdb) run
Starting program: /usr/lib/dovecot/imap 

Breakpoint 1, main (argc=1, argv=0x7fffffffed18) at main.c:416
416     {
(gdb) print mail_search_arg_init
$1 = {void (struct mail_search_args *, struct mail_search_arg *, bool, const 
union array__seq_range *)} 0x7ffff7ac67e0 <mail_search_arg_init>
(gdb) b *$1+302
Breakpoint 2 at 0x7ffff7ac690e: file ../../src/lib/array.h, line 193.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000555555561510 in main at main.c:416
        breakpoint already hit 1 time
2       breakpoint     keep y   0x00007ffff7ac690e in mail_search_arg_init at 
../../src/lib/array.h:193
(gdb) disassemble 0x00007ffff7ac690e-0x30,0x00007ffff7ac690e+0x30
Dump of assembler code from 0x7ffff7ac68de to 0x7ffff7ac693e:
   0x00007ffff7ac68de <mail_search_arg_init+254>:       (bad)  
   0x00007ffff7ac68df <mail_search_arg_init+255>:       add    %eax,(%rax)
   0x00007ffff7ac68e1 <mail_search_arg_init+257>:       add    
%al,-0x7af0dbc8(%rax)
   0x00007ffff7ac68e7 <mail_search_arg_init+263>:       std    
   0x00007ffff7ac68e8 <mail_search_arg_init+264>:       add    %al,(%rax)
   0x00007ffff7ac68ea <mail_search_arg_init+266>:       add    
%al,0xf000178(%rax)
   0x00007ffff7ac68f0 <mail_search_arg_init+272>:       test   %esi,%ebx
   0x00007ffff7ac68f2 <mail_search_arg_init+274>:       add    %al,(%rax)
   0x00007ffff7ac68f4 <mail_search_arg_init+276>:       add    %cl,-0x75(%rcx)
   0x00007ffff7ac68f7 <mail_search_arg_init+279>:       jg     0x7ffff7ac6911 
<mail_search_arg_init+305>
   0x00007ffff7ac68f9 <mail_search_arg_init+281>:       xor    %esi,%esi
   0x00007ffff7ac68fb <mail_search_arg_init+283>:       callq  0x7ffff7abed08
   0x00007ffff7ac6900 <mail_search_arg_init+288>:       test   %r12,%r12
   0x00007ffff7ac6903 <mail_search_arg_init+291>:       je     0x7ffff7ac6930 
<mail_search_arg_init+336>
   0x00007ffff7ac6905 <mail_search_arg_init+293>:       mov    (%r12),%rsi
   0x00007ffff7ac6909 <mail_search_arg_init+297>:       test   %rsi,%rsi
   0x00007ffff7ac690c <mail_search_arg_init+300>:       je     0x7ffff7ac6930 
<mail_search_arg_init+336>
   0x00007ffff7ac690e <mail_search_arg_init+302>:       mov    0x8(%r12),%rax   
                             <<<<<<<<<<<<<<
   0x00007ffff7ac6913 <mail_search_arg_init+307>:       cmp    %rax,0x20(%r15)
   0x00007ffff7ac6917 <mail_search_arg_init+311>:       jne    0x7ffff7ac6bdb 
<mail_search_arg_init+1019>
   0x00007ffff7ac691d <mail_search_arg_init+317>:       mov    0x18(%r15),%rdi
   0x00007ffff7ac6921 <mail_search_arg_init+321>:       mov    
$0xffffffffffffffff,%rcx
   0x00007ffff7ac6928 <mail_search_arg_init+328>:       xor    %edx,%edx
   0x00007ffff7ac692a <mail_search_arg_init+330>:       callq  0x7ffff7ac0e60
   0x00007ffff7ac692f <mail_search_arg_init+335>:       nop
   0x00007ffff7ac6930 <mail_search_arg_init+336>:       mov    0x8(%rsp),%rdi
   0x00007ffff7ac6935 <mail_search_arg_init+341>:       callq  0x7ffff7abdde8
   0x00007ffff7ac693a <mail_search_arg_init+346>:       test   %al,%al
   0x00007ffff7ac693c <mail_search_arg_init+348>:       jne    0x7ffff7ac6890 
<mail_search_arg_init+176>
End of assembler dump.
(gdb) disassemble /m 0x00007ffff7ac690e-0x10,0x00007ffff7ac690e+0x10
Dump of assembler code from 0x7ffff7ac68fe to 0x7ffff7ac691e:
193             i_assert(dest_array->element_size == src_array->element_size);
   0x00007ffff7ac690e <mail_search_arg_init+302>:       mov    0x8(%r12),%rax
   0x00007ffff7ac6913 <mail_search_arg_init+307>:       cmp    %rax,0x20(%r15)
   0x00007ffff7ac6917 <mail_search_arg_init+311>:       jne    0x7ffff7ac6bdb 
<mail_search_arg_init+1019>

194             buffer_append_buf(dest_array->buffer, src_array->buffer, 0, 
(size_t)-1);
   0x00007ffff7ac691d <mail_search_arg_init+317>:       mov    0x18(%r15),%rdi
   0x00007ffff7ac6921 <mail_search_arg_init+321>:       mov    
$0xffffffffffffffff,%rcx
   0x00007ffff7ac6928 <mail_search_arg_init+328>:       xor    %edx,%edx
   0x00007ffff7ac692a <mail_search_arg_init+330>:       callq  0x7ffff7ac0e60
   0x00007ffff7ac692f <mail_search_arg_init+335>:       nop

End of assembler dump.



$ cat -n src/lib/array.h | grep "193" -C6
   187          array_append_i(&(array)->arr + ARRAY_TYPE_CHECK(array, data), \
   188                  data, count)
   189
   190  static inline void
   191  array_append_array_i(struct array *dest_array, const struct array 
*src_array)
   192  {
   193          i_assert(dest_array->element_size == src_array->element_size);
   194          buffer_append_buf(dest_array->buffer, src_array->buffer, 0, 
(size_t)-1);
   195  }
   196  #define array_append_array(dest_array, src_array) \
   197          array_append_array_i(&(dest_array)->arr + 
ARRAY_TYPES_CHECK(dest_array, src_array), \
   198                               &(src_array)->arr)
   199



(gdb) disassemble /m mail_search_arg_init
Dump of assembler code for function mail_search_arg_init:
21              if (arg->value.str != NULL && strcmp(arg->value.str, "$") == 0) 
{
   0x00007ffff7ac68d5 <+245>:   mov    0x28(%r15),%rax
   0x00007ffff7ac68d9 <+249>:   test   %rax,%rax
   0x00007ffff7ac68dc <+252>:   je     0x7ffff7ac69e8 <mail_search_arg_init+520>
   0x00007ffff7ac68e2 <+258>:   cmpb   $0x24,(%rax)
   0x00007ffff7ac68e5 <+261>:   jne    0x7ffff7ac69e8 <mail_search_arg_init+520>
   0x00007ffff7ac68eb <+267>:   cmpb   $0x0,0x1(%rax)
   0x00007ffff7ac68ef <+271>:   jne    0x7ffff7ac69e8 <mail_search_arg_init+520>

22                      /* SEARCHRES: Replace with saved uidset */
23                      array_clear(&arg->value.seqset);
24                      if (search_saved_uidset == NULL ||
   0x00007ffff7ac6900 <+288>:   test   %r12,%r12
   0x00007ffff7ac6903 <+291>:   je     0x7ffff7ac6930 <mail_search_arg_init+336>
   0x00007ffff7ac6905 <+293>:   mov    (%r12),%rsi
   0x00007ffff7ac6909 <+297>:   test   %rsi,%rsi
   0x00007ffff7ac690c <+300>:   je     0x7ffff7ac6930 <mail_search_arg_init+336>

25                          !array_is_created(search_saved_uidset))
26                              return;
27
28                      array_append_array(&arg->value.seqset, 
search_saved_uidset);
29                      return;
30              }
31
32              arg->type = SEARCH_SEQSET;
   0x00007ffff7ac69ee <+526>:   movl   $0x3,0x8(%r15)

33
...




$ grep "array_append_array(&arg->value.seqset, search_saved_uidset);" . -Rn -C15
./src/lib-storage/mail-search.c-13-static void
./src/lib-storage/mail-search.c-14-mailbox_uidset_change(struct mail_search_arg 
*arg, struct mailbox *box,
./src/lib-storage/mail-search.c-15-                   const 
ARRAY_TYPE(seq_range) *search_saved_uidset)
./src/lib-storage/mail-search.c-16-{
./src/lib-storage/mail-search.c-17-     struct seq_range *uids;
./src/lib-storage/mail-search.c-18-     unsigned int i, count;
./src/lib-storage/mail-search.c-19-     uint32_t seq1, seq2;
./src/lib-storage/mail-search.c-20-
./src/lib-storage/mail-search.c-21-     if (arg->value.str != NULL && 
strcmp(arg->value.str, "$") == 0) {
./src/lib-storage/mail-search.c-22-             /* SEARCHRES: Replace with 
saved uidset */
./src/lib-storage/mail-search.c-23-             array_clear(&arg->value.seqset);
./src/lib-storage/mail-search.c-24-             if (search_saved_uidset == NULL 
||
./src/lib-storage/mail-search.c-25-                 
!array_is_created(search_saved_uidset))
./src/lib-storage/mail-search.c-26-                     return;
./src/lib-storage/mail-search.c-27-
./src/lib-storage/mail-search.c:28:             
array_append_array(&arg->value.seqset, search_saved_uidset);
./src/lib-storage/mail-search.c-29-             return;
./src/lib-storage/mail-search.c-30-     }
./src/lib-storage/mail-search.c-31-
./src/lib-storage/mail-search.c-32-     arg->type = SEARCH_SEQSET;
./src/lib-storage/mail-search.c-33-
./src/lib-storage/mail-search.c-34-     /* make a copy of the UIDs */
./src/lib-storage/mail-search.c-35-     count = array_count(&arg->value.seqset);
./src/lib-storage/mail-search.c-36-     if (count == 0) {
./src/lib-storage/mail-search.c-37-             /* empty set, keep it */
./src/lib-storage/mail-search.c-38-             return;
./src/lib-storage/mail-search.c-39-     }
./src/lib-storage/mail-search.c-40-     uids = t_new(struct seq_range, count);
./src/lib-storage/mail-search.c-41-     memcpy(uids, 
array_idx(&arg->value.seqset, 0), sizeof(*uids) * count);
./src/lib-storage/mail-search.c-42-
./src/lib-storage/mail-search.c-43-     /* put them back to the range as 
sequences */



$ grep "struct array {" . -Rn -A4
./src/lib/array-decl.h:12:struct array {
./src/lib/array-decl.h-13-      buffer_t *buffer;
./src/lib/array-decl.h-14-      size_t element_size;
./src/lib/array-decl.h-15-};
./src/lib/array-decl.h-16-



###########


From submitter:
    kernel: [118616.482998] imap[31111]: segfault at 8 ip 00007efbff924cbb sp 
00007fff0b333890 error 4 in libdovecot-storage.so.0.0.0[7efbff858000+145000]


root@debian:~# grep "cbb " gdb_2019-03-29_23-29-10.log | grep "0x8("
   0x00007ffff7af5cbb <dbox_save_write_metadata+395>:   mov    0x8(%rbp),%rdx
   0x00007ffff7af8cbb <maildir_mail_get_special+635>:   mov    0x8(%rdi),%rdi
   0x00007ffff7affcbb <maildir_sync_context+699>:       mov    0x8(%rdi),%rdx
   0x00007ffff7b54cbb <index_sync_search_results_uidify+91>:    mov    
0x8(%rax),%rax

-> 4 matching candidates ...


Reply via email to