Occasional crash in db-auth.c (Valgrind: Invalid read of size 4 et al.), Dovecot 2.2.27+
Jonas Wielicki
jonas at wielicki.name
Sat Jan 27 16:37:50 EET 2018
Dear list,
We are encountering troubles with dovecot using LDAP userdbs on Debian stretch
(but if I’m reading valgrind correctly, we can reproduce this with vanilla
dovecot master). Minimal reproducer below.
While testing an upgrade to Debian stretch (dovecot-core=1:2.2.27-3+deb9u1),
auth-worker has stopped working. We are using two LDAP user databases; one
which is iterable, and one which is not (for reasons; I think this is not
relevant; if it is, we’re happy to elaborate).
The issue seems to be present in any LDAP userdb iteration handling, but it
only seems to cause a crash in certain conditions which seem to be
reproducibly caused by our setup for some reason.
We’re seeing one of two errors.
Variant A:
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: *** Error in `dovecot/auth':
free(): corrupted unsorted chunks: 0x000056553f0fcfa0 ***
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: ======= Backtrace: =========
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /lib/x86_64-linux-gnu/
libc.so.6(+0x70bcb)[0x7f78426adbcb]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /lib/x86_64-linux-gnu/
libc.so.6(+0x76f96)[0x7f78426b3f96]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /lib/x86_64-linux-gnu/
libc.so.6(+0x777de)[0x7f78426b47de]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /usr/lib/dovecot/modules/
auth/libauthdb_ldap.so(+0x5bde)[0x7f7842008bde]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /usr/lib/dovecot/
libdovecot.so.0(io_loop_call_io+0x52)[0x7f78430cfdd2]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /usr/lib/dovecot/
libdovecot.so.0(io_loop_handler_run_internal+0x109)[0x7f78430d1409]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /usr/lib/dovecot/
libdovecot.so.0(io_loop_handler_run+0x3c)[0x7f78430cfe6c]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /usr/lib/dovecot/
libdovecot.so.0(io_loop_run+0x38)[0x7f78430d0018]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /usr/lib/dovecot/
libdovecot.so.0(master_service_run+0x13)[0x7f7843057e93]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: dovecot/auth(main+0x398)
[0x56553da45f98]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: /lib/x86_64-linux-gnu/
libc.so.6(__libc_start_main+0xf1)[0x7f784265d2b1]
Jan 27 13:40:05 up2 dovecot: auth-worker: Error: dovecot/auth(_start+0x2a)
[0x56553da461aa]
Variant B:
Jan 27 13:06:56 up2 dovecot: auth-worker(27495): Panic: file db-ldap.c: line
840 (db_ldap_result_unref): assertion failed: (res->refcount > 0)
Jan 27 13:06:56 up2 dovecot: auth-worker(27495): Error: Raw backtrace: /usr/
lib/dovecot/libdovecot.so.0(+0x95272) [0x7f027a4fc272] -> /usr/lib/dovecot/
libdovecot.so.0(+0x9536d) [0x7f027a4fc36d] -> /usr/lib/dovecot/libdovecot.so.
0(i_fatal+0) [0x7f027a492951] -> /usr/lib/dovecot/modules/auth/
libauthdb_ldap.so(+0x3868) [0x7f0279447868] -> /usr/lib/dovecot/modules/auth/
libauthdb_ldap.so(+0x5d7c) [0x7f0279449d7c] -> /usr/lib/dovecot/libdovecot.so.
0(io_loop_call_io+0x52) [0x7f027a510dd2] -> /usr/lib/dovecot/libdovecot.so.
0(io_loop_handler_run_internal+0x109) [0x7f027a512409] -> /usr/lib/dovecot/
libdovecot.so.0(io_loop_handler_run+0x3c) [0x7f027a510e6c] -> /usr/lib/
dovecot/libdovecot.so.0(io_loop_run+0x38) [0x7f027a511018] -> /usr/lib/
dovecot/libdovecot.so.0(master_service_run+0x13) [0x7f027a498e93] -> dovecot/
auth(main+0x398) [0x55b981cd2f98] -> /lib/x86_64-linux-gnu/libc.so.
6(__libc_start_main+0xf1) [0x7f0279a9e2b1] -> dovecot/auth(_start+0x2a)
[0x55b981cd31aa]
When running auth-worker within valgrind, we get more information (valgrind
extract from mail.log attached for two versions of dovecot). We have attached
mail.log contents for the respective valgrind runs.
This seems to affect at least 2.2.27 onwards. We can reproduce the crash with
our production data 100% of the time. The valgrind error is present even with
very minimal setups (see below). Unfortunately, I haven’t been able so far to
create an LDAP database which produces the crash as reliable as our production
database does (which we cannot share for obvious reasons).
Minimal Reproducer of Valgrind error:
- Install dovecot 2.2.27 from debian stretch, or compile from master.
- Install valgrind
- In conf.d/10-auth.conf, disable auth-system.conf.ext
- In conf.d/10-auth.conf, enable auth-ldap.conf.ext
- Set contents of dovecot-ldap.conf.ext to:
hosts = localhost
base = dc=nodomain
- In conf.d/10-master.conf, in section "service auth-worker", set
executable = /usr/bin/valgrind /usr/lib/dovecot/auth -w
(path may differ on your system)
- Install an LDAP server with a database for dc=nodomain; this is trivial to
do with debian: Simply install slapd and systemctl start slapd.
- Start dovecot
- Run doveadm user '*'
- You should find the error in the mail.log.
I hope this is somehow useful to fix our crash issue. We’ll be happy to
provide more information as needed.
kind regards,
Jonas
-------------- next part --------------
A non-text attachment was scrubbed...
Name: valgrind-dovecot-stretch.log
Type: text/x-log
Size: 15502 bytes
Desc: not available
URL: <https://dovecot.org/pipermail/dovecot/attachments/20180127/36fb04ee/attachment-0002.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: valgrind-dovecot-master.log
Type: text/x-log
Size: 16271 bytes
Desc: not available
URL: <https://dovecot.org/pipermail/dovecot/attachments/20180127/36fb04ee/attachment-0003.bin>
More information about the dovecot
mailing list