Hello Kim-Alexander Brodowski,
I just tried to get some more information from the segfault
lines, while not being involved in packaging.

It seems to point to function sieve_bytecode_version
in sieve/bc_eval.c:1809.
Unfortunately upstream seems to have removed/rewritten that
function completely [1].

I hope this is of some help to the maintainer.
A little more context in form of a backtrace may still be helpful.
That could probably be retrieved by installing a coredump
collector like systemd-coredump or corekeeper on the test system.
The first one should already print a stack trace to the journal.
If no core is collected maybe [2] could help to get one.

Kind regards,
Bernhard


(gdb) list sieve_bytecode_version
1800
1801    int sieve_bytecode_version(const sieve_bytecode_t *bc)
1802    {
1803        if (!bc) return 0;
1804
1805        int version, v_index;
1806        const bytecode_input_t *input = (bytecode_input_t *) bc->data;
1807
1808        v_index = BYTECODE_MAGIC_LEN / sizeof(bytecode_input_t);
1809        version = ntohl(input[v_index].op);                             
<<<<<<<<
1810
1811        /* XXX may need to convert value "1" from host byte order? */
1812        return version;
1813    }


[1] 
https://github.com/cyrusimap/cyrus-imapd/commit/cf67cc90bc0f8d34d2c5f115bd872cdff041b33e#diff-f5615f080eb69ca914c3ec4e0e8389d0
[2] 
https://www.cyrusimap.org/imap/reference/faqs/o-coredump.html#faqs-o-coredump
# Buster amd64 qemu VM 2019-04-15


apt update
apt dist-upgrade


apt install dpkg-dev devscripts mc gdb cyrus-common cyrus-common-dbgsym 
libc6-dev




##########


gdb -q --args /usr/lib/cyrus/bin/lmtpd

set width 0
set pagination off
b main
run
generate-core-file /home/benutzer/core-example



gdb -q /usr/lib/cyrus/bin/lmtpd --core /home/benutzer/core-example

set width 0
set pagination off
directory /home/benutzer/source/cyrus-common/orig/cyrus-imapd-3.0.8


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



mkdir /home/benutzer/source/cyrus-common/orig -p
cd    /home/benutzer/source/cyrus-common/orig
apt source cyrus-common
cd


##########



# From message #5:
kernel: [10870.893304] lmtpd[13473]: segfault at c ip 00007fbb6d918dd9 sp 
00007ffc441f15a8 error 4 in libcyrus_sieve.so.0.0.0[7fbb6d913000+18000]
kernel: [10870.893310] Code: 24 28 e8 8a a4 ff ff 48 85 c0 49 89 c7 0f 94 c3 e9 
47 ff ff ff e8 17 a8 ff ff 0f 1f 80 00 00 00 00 48 85 ff 74 0b 48 8b 47 08 <8b> 
40 0c 0f c8 c3 90 31 c0 c3 66 66 2e 0f 1f 84 00 00 00 00 00 66


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



##########



crash instruction  - start .init    == diff
0x00007fbb6d918dd9 - 0x7fbb6d913000 == 0x5DD9




(gdb) info target
Symbols from "/usr/lib/cyrus/bin/lmtpd".
Native process:
        Using the running image of child Thread 0x7ffff49f3000 (LWP 1941).
        While running this, GDB does not access memory from...
Local exec file:
        `/usr/lib/cyrus/bin/lmtpd', file type elf64-x86-64.
        Entry point: 0x55555555c0c0
        0x00005555555542a8 - 0x00005555555542c4 is .interp
...
        0x00007ffff7fa0238 - 0x00007ffff7fa025c is .note.gnu.build-id in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa0260 - 0x00007ffff7fa03e0 is .gnu.hash in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa03e0 - 0x00007ffff7fa13a0 is .dynsym in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa13a0 - 0x00007ffff7fa1e43 is .dynstr in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa1e44 - 0x00007ffff7fa1f94 is .gnu.version in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa1f98 - 0x00007ffff7fa1ff8 is .gnu.version_r in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa1ff8 - 0x00007ffff7fa3540 is .rela.dyn in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa3540 - 0x00007ffff7fa4398 is .rela.plt in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0

        0x00007ffff7fa5000 - 0x00007ffff7fa5017 is .init in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa5020 - 0x00007ffff7fa59c0 is .plt in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa59c0 - 0x00007ffff7fa59c8 is .plt.got in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fa59d0 - 0x00007ffff7fbc4d5 is .text in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fbc4d8 - 0x00007ffff7fbc4e1 is .fini in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0

        0x00007ffff7fbd000 - 0x00007ffff7fc26ca is .rodata in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fc26cc - 0x00007ffff7fc2ce0 is .eh_frame_hdr in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fc2ce0 - 0x00007ffff7fc5034 is .eh_frame in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fc6070 - 0x00007ffff7fc6078 is .init_array in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fc6078 - 0x00007ffff7fc6080 is .fini_array in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fc6080 - 0x00007ffff7fc6798 is .data.rel.ro in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fc6798 - 0x00007ffff7fc6ac8 is .dynamic in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fc6ac8 - 0x00007ffff7fc6fe8 is .got in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fc7000 - 0x00007ffff7fc7030 is .data in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
        0x00007ffff7fc7030 - 0x00007ffff7fc7160 is .bss in 
/usr/lib/x86_64-linux-gnu/libcyrus_sieve.so.0
...
        0x00007ffff4a00008 - 0x00007ffff4a00018 is .bss in 
/lib/x86_64-linux-gnu/libuuid.so.1
(gdb) 




current start .init + diff   == current ip
0x00007ffff7fa5000  + 0x5DD9 == 0x7FFFF7FAADD9




(gdb) x/84xb 0x7FFFF7FAADD9-42
0x7ffff7faadaf <look_for_me+511>:            24 28 e8 8a a4 ff ff 48
0x7ffff7faadb7 <look_for_me+519>:            85 c0 49 89 c7 0f 94 c3
0x7ffff7faadbf <look_for_me+527>:            e9 47 ff ff ff e8 17 a8
0x7ffff7faadc7 <look_for_me+535>:            ff ff 0f 1f 80 00 00 00
0x7ffff7faadcf:                              00 48 85 ff 74 0b 48 8b
0x7ffff7faadd7 <sieve_bytecode_version+7>:   47 08 8b 40 0c 0f c8 c3
0x7ffff7faaddf <sieve_bytecode_version+15>:  90 31 c0 c3 66 66 2e 0f
0x7ffff7faade7:                              1f 84 00 00 00 00 00 66
0x7ffff7faadef:                              90 41 57 41 56 41 55 41
0x7ffff7faadf7 <sieve_eval_bc+7>:            54 55 53 48 81 ec 58 11
0x7ffff7faadff <sieve_eval_bc+15>:           00 00 48 8b


        # From message 5:
        kernel: [10870.893310] Code: 24 28 e8 8a a4 ff ff 48 85 c0 49 89 c7 0f 
94 c3 e9 47 ff ff ff e8 17 a8 ff ff 0f 1f 80 00 00 00 00 48 85 ff 74 0b 48 8b 
47 08 <8b> 40 0c 0f c8 c3 90 31 c0 c3 66 66 2e 0f 1f 84 00 00 00 00 00 66


(gdb) disassemble sieve_bytecode_version
Dump of assembler code for function sieve_bytecode_version:
   0x00007ffff7faadd0 <+0>:     test   %rdi,%rdi
   0x00007ffff7faadd3 <+3>:     je     0x7ffff7faade0 
<sieve_bytecode_version+16>
   0x00007ffff7faadd5 <+5>:     mov    0x8(%rdi),%rax
   0x00007ffff7faadd9 <+9>:     mov    0xc(%rax),%eax                           
    <<<<<<<<<<<<
   0x00007ffff7faaddc <+12>:    bswap  %eax
   0x00007ffff7faadde <+14>:    retq   
   0x00007ffff7faaddf <+15>:    nop
   0x00007ffff7faade0 <+16>:    xor    %eax,%eax
   0x00007ffff7faade2 <+18>:    retq   
End of assembler dump.



(gdb) b *0x00007ffff7faadd9
Breakpoint 1 at 0x7ffff7faadd9: file 
/usr/include/x86_64-linux-gnu/bits/byteswap.h, line 52.



(gdb) list sieve_bytecode_version
1800
1801    int sieve_bytecode_version(const sieve_bytecode_t *bc)
1802    {
1803        if (!bc) return 0;
1804
1805        int version, v_index;
1806        const bytecode_input_t *input = (bytecode_input_t *) bc->data;
1807
1808        v_index = BYTECODE_MAGIC_LEN / sizeof(bytecode_input_t);
1809        version = ntohl(input[v_index].op);
1810
1811        /* XXX may need to convert value "1" from host byte order? */
1812        return version;
1813    }

sieve/bc_eval.c:1809


(gdb) disassemble /m sieve_bytecode_version
Dump of assembler code for function sieve_bytecode_version:
1802    {

1803        if (!bc) return 0;
   0x00007ffff7faadd0 <+0>:     test   %rdi,%rdi
   0x00007ffff7faadd3 <+3>:     je     0x7ffff7faade0 
<sieve_bytecode_version+16>

1804
1805        int version, v_index;
1806        const bytecode_input_t *input = (bytecode_input_t *) bc->data;
1807
1808        v_index = BYTECODE_MAGIC_LEN / sizeof(bytecode_input_t);
1809        version = ntohl(input[v_index].op);
1810
1811        /* XXX may need to convert value "1" from host byte order? */
1812        return version;
   0x00007ffff7faadde <+14>:    retq   
   0x00007ffff7faaddf <+15>:    nop
   0x00007ffff7faade0 <+16>:    xor    %eax,%eax
   0x00007ffff7faade2 <+18>:    retq   
   0x00007ffff7faade3:  data16 nopw %cs:0x0(%rax,%rax,1)
   0x00007ffff7faadee:  xchg   %ax,%ax

End of assembler dump.




(gdb) ptype sieve_bytecode_t
type = struct sieve_bytecode {
    ino_t inode;
    const char *data;
    size_t len;
    int fd;
    int is_executing;
    sieve_bytecode_t *next;
}

(gdb) ptype bytecode_input_t
type = union {
    int op;
    int value;
    int jump;
    int listlen;
    int len;
    int str;
}



benutzer@debian:~$ cat -n /usr/include/x86_64-linux-gnu/bits/byteswap.h | grep 
-E "^    52" -C5
    47
    48  static __inline __uint32_t
    49  __bswap_32 (__uint32_t __bsx)
    50  {
    51  #if __GNUC_PREREQ (4, 3)
    52    return __builtin_bswap32 (__bsx);
    53  #else
    54    return __bswap_constant_32 (__bsx);
    55  #endif
    56  }
    57

Reply via email to