I tried to compile an MSAN-instrumented GNUTLS as follows, based on what serg had attempted:
cd /mariadb/gnutls28-3.6.12
|
CC=clang-10 CXX=clang++-10 ./configure C{,XX}FLAGS="-fno-omit-frame-pointer -O2 -g -fsanitize=memory" LDFLAGS="-fsanitize=memory" --with-included-libtasn1 --with-included-unistring --without-p11-kit && make -j$(nproc)
|
For me, it would fail due to missing makeinfo when generating documentation, but not before producing the desired output in lib/.libs.
With this, I tried to invoke a few known-failing tests mentioned in MDEV-20377:
MSAN_OPTIONS=abort_on_error=1 LD_LIBRARY_PATH=/mariadb/llvm-toolchain-10-10.0.0/libc++msan/lib:/mariadb/gnutls28-3.6.12/lib/.libs ./mtr --force --parallel=auto --max-test-fail=0 main.mysql_client_test_nonblock main.mysql_client_test main.mysql_client_test_comp main.tls_version main.ssl_8k_key main.flush_ssl perfschema.hostcache_ipv6_ssl main.ssl_ca main.userstat main.mysql_upgrade_ssl main.ssl_7937 main.openssl_1 main.ssl_connect main.ssl_timeout-9836 main.ssl main.ssl_cipher main.ssl-big main.ssl_compress perfschema.connection_type_notwin main.ssl_timeout perfschema.hostcache_ipv4_ssl
|
For most tests, I am seeing something like the following:
10.5 05fa4558e0e82302ece981deabce764491464eb2
|
CURRENT_TEST: perfschema.connection_type_notwin
|
==625405==WARNING: MemorySanitizer: use-of-uninitialized-value
|
#0 0x7f98883bb98f in asn1_get_tag_der /mariadb/gnutls28-3.6.12/lib/minitasn1/decoding.c:181:7
|
#1 0x7f98883bb98f in _asn1_extract_tag_der /mariadb/gnutls28-3.6.12/lib/minitasn1/decoding.c:629:11
|
#2 0x7f98883b51ab in extract_tag_der_recursive /mariadb/gnutls28-3.6.12/lib/minitasn1/decoding.c:716:12
|
#3 0x7f98883b51ab in asn1_der_decoding2 /mariadb/gnutls28-3.6.12/lib/minitasn1/decoding.c:1045:8
|
#4 0x7f98882b6735 in _asn1_strict_der_decode /mariadb/gnutls28-3.6.12/lib/x509/./common.h:288:9
|
#5 0x7f98882b6735 in gnutls_x509_crt_import /mariadb/gnutls28-3.6.12/lib/x509/x509.c:606:6
|
#6 0x7f98882c71dc in gnutls_x509_crt_list_import /mariadb/gnutls28-3.6.12/lib/x509/x509.c:3847:8
|
#7 0x7f98882c6bdf in gnutls_x509_crt_list_import2 /mariadb/gnutls28-3.6.12/lib/x509/x509.c:3727:6
|
#8 0x7f98882e64b0 in gnutls_x509_trust_list_add_trust_mem /mariadb/gnutls28-3.6.12/lib/x509/verify-high2.c:93:7
|
#9 0x7f98882e6f90 in gnutls_x509_trust_list_add_trust_file /mariadb/gnutls28-3.6.12/lib/x509/verify-high2.c:378:6
|
#10 0x7f988818f150 in gnutls_certificate_set_x509_trust_file /mariadb/gnutls28-3.6.12/lib/cert-cred-x509.c:1209:8
|
#11 0x5652ef1a0425 in ma_tls_set_certs /mariadb/10.5m/libmariadb/libmariadb/secure/gnutls.c:1077:16
|
#12 0x5652ef1a0425 in ma_tls_init /mariadb/10.5m/libmariadb/libmariadb/secure/gnutls.c:1136:19
|
#13 0x5652ef155e53 in ma_pvio_tls_init /mariadb/10.5m/libmariadb/libmariadb/ma_tls.c:71:20
|
#14 0x5652ef1554e3 in ma_pvio_start_ssl /mariadb/10.5m/libmariadb/libmariadb/ma_pvio.c:527:21
|
#15 0x5652ef1c29b2 in send_client_reply_packet /mariadb/10.5m/libmariadb/plugins/auth/my_auth.c:309:9
|
#16 0x5652ef1c29b2 in client_mpvio_write_packet /mariadb/10.5m/libmariadb/plugins/auth/my_auth.c:451:12
|
#17 0x5652ef1be783 in native_password_auth_client /mariadb/10.5m/libmariadb/plugins/auth/my_auth.c:92:9
|
#18 0x5652ef1bfe3f in run_plugin_auth /mariadb/10.5m/libmariadb/plugins/auth/my_auth.c:599:8
|
#19 0x5652ef13b44a in mthd_my_real_connect /mariadb/10.5m/libmariadb/libmariadb/mariadb_lib.c:1646:7
|
#20 0x5652ef138211 in mysql_real_connect /mariadb/10.5m/libmariadb/libmariadb/mariadb_lib.c:1295:10
|
#21 0x5652ef0e10ab in wrap_mysql_real_connect(st_mysql*, char const*, char const*, char const*, char const*, unsigned int, char const*, unsigned long) /mariadb/10.5m/client/../tests/nonblock-wrappers.h:165:1
|
#22 0x5652ef0e10ab in connect_n_handle_errors(st_command*, st_mysql*, char const*, char const*, char const*, char const*, int, char const*) /mariadb/10.5m/client/mysqltest.cc:5754:11
|
#23 0x5652ef0e3c41 in do_connect(st_command*) /mariadb/10.5m/client/mysqltest.cc:6072:7
|
#24 0x5652ef106103 in main /mariadb/10.5m/client/mysqltest.cc:9369:9
|
#25 0x7f9887ba9cc9 in __libc_start_main csu/../csu/libc-start.c:308:16
|
#26 0x5652ef02bac9 in _start (/dev/shm/10.5msan/client/mariadb-test+0x82ac9)
|
|
SUMMARY: MemorySanitizer: use-of-uninitialized-value /mariadb/gnutls28-3.6.12/lib/minitasn1/decoding.c:181:7 in asn1_get_tag_der
|
ORIGIN: invalid (0). Might be a bug in MemorySanitizer origin tracking.
|
I have never before seen the ORIGIN: invalid (0). Maybe some more dependencies of gnutls should be built with instrumentation?
Of the above tests, only main.ssl_7937,nossl passes for me and 22 tests fail.
A few uninstrumented dependencies are being listed:
LD_LIBRARY_PATH=/mariadb/llvm-toolchain-10-10.0.0/libc++msan/lib:/mariadb/gnutls28-3.6.12/lib/.libs ldd ../client/mysqltest
|
ldd output for mysqltest
|
linux-vdso.so.1 (0x00007fff345a0000)
|
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f66a8e5e000)
|
libgnutls.so.30 => /mariadb/gnutls28-3.6.12/lib/.libs/libgnutls.so.30 (0x00007f66a8a66000)
|
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f66a8922000)
|
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f66a891c000)
|
libc++.so.1 => /mariadb/llvm-toolchain-10-10.0.0/libc++msan/lib/libc++.so.1 (0x00007f66a8769000)
|
libc++abi.so.1 => /usr/lib/x86_64-linux-gnu/libc++abi.so.1 (0x00007f66a8731000)
|
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f66a8724000)
|
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f66a870a000)
|
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f66a8545000)
|
/lib64/ld-linux-x86-64.so.2 (0x00007f66ab8d9000)
|
libidn2.so.0 => /usr/lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f66a8524000)
|
libnettle.so.8 => /usr/lib/x86_64-linux-gnu/libnettle.so.8 (0x00007f66a84e4000)
|
libhogweed.so.6 => /usr/lib/x86_64-linux-gnu/libhogweed.so.6 (0x00007f66a849b000)
|
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f66a8416000)
|
libunistring.so.2 => /usr/lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f66a8294000)
|
The libgnutls.so contains many uninstrumented dependencies:
ldd /mariadb/gnutls28-3.6.12/lib/.libs/libgnutls.so.30
|
ldd output for libgnutls.so.30
|
linux-vdso.so.1 (0x00007ffc32bf8000)
|
libidn2.so.0 => /usr/lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f7828768000)
|
libnettle.so.8 => /usr/lib/x86_64-linux-gnu/libnettle.so.8 (0x00007f7828728000)
|
libhogweed.so.6 => /usr/lib/x86_64-linux-gnu/libhogweed.so.6 (0x00007f78286df000)
|
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f782865c000)
|
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7828497000)
|
/lib64/ld-linux-x86-64.so.2 (0x00007f7828ba8000)
|
libunistring.so.2 => /usr/lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f7828315000)
|
serg, I suspect that we would need MSAN-instrumented builds of all of libidn2, libgmp, libnettle, libhogweed, libunistring2 as well.
Could it actually be less effort to implement WolfSSL support in libmariadb than to maintain so many MSAN builds of external libraries?
I suspect it'll be much easier to build gnutls or openssl with instrumentation that add a totally new wolfssl support C/C only for the purpose of running MSAN