On 26.10.2016 13:48, Christian Ehrhardt wrote:
Hi,
I was wondering about a crash when building dovecot 2.2.25 on latest Ubuntu.
I wondered as I've had the same source building on Debian just fine.

Some debugging led me to this weird behavior:
Using this gdb command file called autoreportissue in my case:
break dcrypt_initialize
  commands
    p dcrypt_vfs
    p &dcrypt_vfs
    watch dcrypt_vfs
    c
  end
break dcrypt_set_vfs
  commands
    p dcrypt_vfs
    p &dcrypt_vfs
    c
  end
r

Running test-crypto on Debian and Ubuntu reported those two behaviours:
gdb -d /root/dovecot-2.2.25/src/ -x autoreportissue ./test-crypto

Good:
Breakpoint 1, dcrypt_initialize (backend=0x555555587c02 "openssl", set=0x0, error_r=0x0) at dcrypt.c:15
15              if (dcrypt_vfs != NULL) {
$1 = (struct dcrypt_vfs *) 0x0
$2 = (struct dcrypt_vfs **) 0x555555796370 <dcrypt_vfs>
Hardware watchpoint 3: dcrypt_vfs
Breakpoint 2, dcrypt_set_vfs (vfs=0x7ffff7835020 <dcrypt_openssl_vfs>) at dcrypt.c:56
56              dcrypt_vfs = vfs;
$3 = (struct dcrypt_vfs *) 0x0
$4 = (struct dcrypt_vfs **) 0x555555796370 <dcrypt_vfs>
Hardware watchpoint 3: dcrypt_vfs
Old value = (struct dcrypt_vfs *) 0x0
New value = (struct dcrypt_vfs *) 0x7ffff7835020 <dcrypt_openssl_vfs>
dcrypt_set_vfs (vfs=0x7ffff7835020 <dcrypt_openssl_vfs>) at dcrypt.c:57
57      }

Bad:
Breakpoint 1, dcrypt_initialize (backend=0x555555589f02 "openssl", set=0x0, error_r=0x0) at dcrypt.c:11
11      {
$1 = (struct dcrypt_vfs *) 0x0
$2 = (struct dcrypt_vfs **) 0x555555798370 <dcrypt_vfs>
Hardware watchpoint 3: dcrypt_vfs
Breakpoint 2, dcrypt_set_vfs (vfs=0x7ffff780a020 <dcrypt_openssl_vfs>) at dcrypt.c:56
56              dcrypt_vfs = vfs;
$3 = (struct dcrypt_vfs *) 0x0
$4 = (struct dcrypt_vfs **) 0x7ffff780a890 <dcrypt_vfs>
Panic: file dcrypt.c: line 34 (dcrypt_initialize): assertion failed: (dcrypt_vfs != NULL) Error: Raw backtrace: /root/dovecot-2.2.25/src/lib-dcrypt/test-crypto(+0x15f7c) [0x555555569f7c] -> /root/dovecot-2.2.25/src/lib-dcrypt/test-crypto(default_error_handler+0) [0x55555556a030] -> /root/dovecot-2.2.25/src/lib-dcrypt/test-crypto(i_fatal+0) [0x55555556a2ff] -> /root/dovecot-2.2.25/src/lib-dcrypt/test-crypto(dcrypt_initialize+0x140) [0x55555555f030] -> /root/dovecot-2.2.25/src/lib-dcrypt/test-crypto(main+0x23) [0x55555556706d] -> /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1) [0x7ffff782d3f1] -> /root/dovecot-2.2.25/src/lib-dcrypt/test-crypto(_start+0x2a) [0x55555555edea]
Program received signal SIGABRT, Aborted.

One can see that in the bad case the pointer of dcrypt_vfs is pointing to something of the scope of the .libs/libdcrypt_openssl.so file and not the dcrypt_initialize of test-crypto.

That made me wonder even more - where would this issue of variable scope come from. After more debugging I found that the linker flag "-Bsymbolic-functions" is the reason. This is default on recent Ubuntu, but not on Debian (?yet?).

Eventually what happens is that the dcrypt_vfs becomes part of the .libs/libdcrypt_openssl.so. So the call from there to dcrypt_set_vfs ends up setting not the expected variable. I was unable to come up with a reasonable fix since I'm not enough into your sublib structure.

For now I assume I'm gonna build the package stripping this flag in Ubuntu. But long term I think dovecot should fix it to work with that compiler flag.
Therefore the report to make you aware.


P.S. thanks to the dovecot community for having unit tests that find this at build time!

--
Christian Ehrhardt
Software Engineer, Ubuntu Server
Canonical Ltd


Hi!

Thank you for reporting this, we'll look into it.

Aki Tuomi
Dovecot oy

Reply via email to