mariadb/mysys
Martin Beck 4ebac0fc86 MDEV-27088: Server crash on ARM (WMM architecture) due to missing barriers in lf-hash (10.5)
MariaDB server crashes on ARM (weak memory model architecture) while
concurrently executing l_find to load node->key and add_to_purgatory
to store node->key = NULL. l_find then uses key (which is NULL), to
pass it to a comparison function.

The specific problem is the out-of-order execution that happens on a
weak memory model architecture. Two essential reorderings are possible,
which need to be prevented.

a) As l_find has no barriers in place between the optimistic read of
the key field lf_hash.cc#L117 and the verification of link lf_hash.cc#L124,
the processor can reorder the load to happen after the while-loop.

In that case, a concurrent thread executing add_to_purgatory on the same
node can be scheduled to store NULL at the key field lf_alloc-pin.c#L253
before key is loaded in l_find.

b) A node is marked as deleted by a CAS in l_delete lf_hash.cc#L247 and
taken off the list with an upfollowing CAS lf_hash.cc#L252. Only if both
CAS succeed, the key field is written to by add_to_purgatory. However,
due to a missing barrier, the relaxed store of key lf_alloc-pin.c#L253
can be moved ahead of the two CAS operations, which makes the value of
the local purgatory list stored by add_to_purgatory visible to all threads
operating on the list. As the node is not marked as deleted yet, the
same error occurs in l_find.

This change three accesses to be atomic.

* optimistic read of key in l_find lf_hash.cc#L117
* read of link for verification lf_hash.cc#L124
* write of key in add_to_purgatory lf_alloc-pin.c#L253

Reviewers: Sergei Vojtovich, Sergei Golubchik

Fixes: MDEV-23510 / d30c1331a18d875e553f3fcf544997e4f33fb943
2021-11-30 15:16:16 +11:00
..
crc32 Fix building crc32_arm64 on NetBSD/aarch64 2021-07-22 16:41:59 +10:00
array.c Merge 10.4 into 10.5 2020-11-03 16:24:47 +02:00
base64.c
ChangeLog
charset-def.c MDEV-7947 strcmp() takes 0.37% in OLTP RO 2020-07-23 10:54:33 +03:00
charset.c MDEV-7947 strcmp() takes 0.37% in OLTP RO 2020-07-23 10:54:33 +03:00
CMakeLists.txt Merge 10.4 into 10.5 2021-10-21 15:26:25 +03:00
crc32ieee.cc MDEV-24745 Generic CRC-32C computation wrongly uses SSE4.2 instructions 2021-04-13 16:15:15 +03:00
errors.c MDEV-7947 strcmp() takes 0.37% in OLTP RO 2020-07-23 10:54:33 +03:00
file_logger.c Merge 10.4 into 10.5 2021-03-05 12:54:43 +02:00
get_password.c perfschema memory related instrumentation changes 2020-03-10 19:24:22 +01:00
guess_malloc_library.c
hash.c Merge 10.4 to 10.5 2020-10-22 17:08:49 +03:00
lf_alloc-pin.c MDEV-27088: Server crash on ARM (WMM architecture) due to missing barriers in lf-hash (10.5) 2021-11-30 15:16:16 +11:00
lf_dynarray.c perfschema memory related instrumentation changes 2020-03-10 19:24:22 +01:00
lf_hash.cc MDEV-27088: Server crash on ARM (WMM architecture) due to missing barriers in lf-hash (10.5) 2021-11-30 15:16:16 +11:00
list.c Merge 10.4 into 10.5 2020-05-13 14:25:06 +03:00
ma_dyncol.c Merge 10.4 into 10.5 2021-04-21 09:01:01 +03:00
mf_arr_appstr.c
mf_cache.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
mf_dirname.c MDEV-21581 Helper functions and methods for CHARSET_INFO 2020-01-28 12:29:23 +04:00
mf_fn_ext.c
mf_format.c
mf_getdate.c
mf_iocache.c Merge 10.4 into 10.5 2021-06-21 14:22:22 +03:00
mf_iocache2.c
mf_keycache.c MDEV-26533 MariaDB 10.5 crashes with key_buffer_size > 4Gb on Windows x64 2021-09-04 17:51:26 +02:00
mf_keycaches.c
mf_loadpath.c
mf_pack.c MDEV-21581 Helper functions and methods for CHARSET_INFO 2020-01-28 12:29:23 +04:00
mf_path.c
mf_qsort.c fix clang build: check alignment the other way 2021-07-26 12:37:25 +03:00
mf_qsort2.c
mf_radix.c
mf_same.c
mf_sort.c perfschema memory related instrumentation changes 2020-03-10 19:24:22 +01:00
mf_soundex.c
mf_tempdir.c cleanup: PSI key is *always* the first argument 2020-03-10 19:24:23 +01:00
mf_tempfile.c MDEV-26601: mysys - O_TMPFILE ^ O_CREAT 2021-09-14 21:06:34 +10:00
mf_unixpath.c
mf_wcomp.c
mulalloc.c perfschema memory related instrumentation changes 2020-03-10 19:24:22 +01:00
my_access.c
my_addr_resolve.c Merge commit '10.4' into 10.5 2021-01-06 10:53:00 +01:00
my_alarm.c
my_alloc.c MDEV-22929 fixup: root_name() clash with clang++ <fstream> 2020-12-03 07:45:48 +02:00
my_atomic_writes.c MDEV-26042 Atomic write capability is not detected correctly 2021-06-29 15:04:27 +03:00
my_basename.c
my_bit.c
my_bitmap.c Merge 10.4 into 10.5 2020-05-31 10:28:59 +03:00
my_chmod.c
my_chsize.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
my_compare.c MDEV-21581 Helper functions and methods for CHARSET_INFO 2020-01-28 12:29:23 +04:00
my_compress.c perfschema memory related instrumentation changes 2020-03-10 19:24:22 +01:00
my_conio.c
my_context.c Merge 10.2 into 10.3 2021-10-13 11:38:21 +03:00
my_copy.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
my_cpu.c MDEV-19845: Make my_cpu.h self-contained 2020-02-01 14:56:05 +02:00
my_create.c
my_default.c Fixed wrong length in my_default.c 2020-05-29 22:47:37 +03:00
my_delete.c Merge branch bb-10.4-release into bb-10.5-release 2021-05-05 23:57:11 +03:00
my_div.c
my_dlerror.c
my_error.c Merge branch '10.4' into 10.5 2020-11-01 14:26:15 +01:00
my_file.c perfschema memory related instrumentation changes 2020-03-10 19:24:22 +01:00
my_fopen.c Merge 10.4 into 10.5 2020-04-25 21:57:52 +03:00
my_fstream.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
my_gethwaddr.c
my_getncpus.c Correct FreeBSD cpuset_t type 2020-04-03 15:30:33 +02:00
my_getopt.c Merge 10.4 into 10.5 2020-06-18 13:58:54 +03:00
my_getpagesize.c
my_getsystime.c Merge 10.4 into 10.5 2019-09-06 17:16:40 +03:00
my_getwd.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
my_init.c MDEV-19935 Create unified CRC-32 interface 2020-09-17 16:07:37 +02:00
my_largepage.c my_largepage: Fix build with MAP_ALIGNED by no MAP_ALIGNED_SUPER 2021-05-25 10:32:45 +10:00
my_lib.c Merge 10.4 into 10.5 2020-04-25 21:57:52 +03:00
my_libwrap.c
my_likely.c cleanup: PSI key is *always* the first argument 2020-03-10 19:24:23 +01:00
my_lock.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
my_lockmem.c Merge 10.3 into 10.4 2019-10-10 11:19:25 +03:00
my_malloc.c MDEV-24858 SIGABRT in DbugExit from my_malloc in Query_cache::init_cache Regression 2021-03-01 15:26:21 +01:00
my_memmem.c
my_mess.c MDEV-23846: O_TMPFILE error in mysqlbinlog stream output breaks restore 2020-11-23 12:16:45 +05:30
my_minidump.cc MDEV-11499 mysqltest, Windows : improve diagnostics if server fails to shutdown 2021-09-24 11:49:28 +02:00
my_mkdir.c Fix various spelling errors still found in code 2021-03-22 18:10:39 +11:00
my_mmap.c libpmem cmake macros 2020-02-04 23:23:50 +04:00
my_new.cc
my_once.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
my_open.c Merge 10.4 into 10.5 2020-04-25 21:57:52 +03:00
my_port.c
my_pread.c Merge 10.3 into 10.4 2019-06-19 10:49:00 +03:00
my_pthread.c Bug#18913935: REMOVE SUPPORT FOR LINUXTHREADS 2020-03-10 19:24:21 +01:00
my_quick.c
my_rdtsc.c Merge 10.4 into 10.5 2020-08-01 14:42:51 +03:00
my_read.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
my_redel.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
my_rename.c Merge 10.3 into 10.4 2020-09-21 12:29:00 +03:00
my_rnd.c MDEV-18531 : Use WolfSSL instead of YaSSL as "bundled" SSL/encryption library 2019-05-22 13:48:25 +02:00
my_safehash.c cleanup: PSI key is *always* the first argument 2020-03-10 19:24:23 +01:00
my_safehash.h
my_seek.c myseek: AIX has no "tell" 2021-03-19 11:14:53 +11:00
my_setuser.c
my_sleep.c
my_static.c MDEV-7947 strcmp() takes 0.37% in OLTP RO 2020-07-23 10:54:33 +03:00
my_static.h
my_symlink.c Added support for more functions when using partitioned S3 tables 2020-04-19 17:33:51 +03:00
my_symlink2.c MDEV-11412 Ensure that table is truly dropped when using DROP TABLE 2020-06-14 19:39:42 +03:00
my_sync.c MDEV-20685: compile fixes for Solaris/OSX/AIX 2020-04-29 12:02:47 +03:00
my_thr_init.c Merge 10.4 into 10.5 2020-04-29 15:40:51 +03:00
my_uuid.c
my_win_popen.cc MDEV-21062 Buildbot, Windows - sporadically missing lines from mtr's "exec" 2019-11-15 15:39:31 +01:00
my_wincond.c
my_winerr.c
my_winfile.c MDEV-16548 - Innodb fails to start on older kernels that don't support F_DUPFD_CLOEXEC 2019-05-24 13:21:14 +04:00
my_winthread.c
my_wintoken.c Merge pull request #1221 from grooverdan/10.4-MDEV-18851-multiple-sized-large-page-support 2020-04-02 23:54:08 +04:00
my_write.c Merge branch '10.3' into 10.4 2019-05-19 20:55:37 +02:00
mysys_priv.h MDEV-7947 strcmp() takes 0.37% in OLTP RO 2020-07-23 10:54:33 +03:00
psi_noop.c Merge 10.4 into 10.5 2021-08-31 10:04:56 +03:00
ptr_cmp.c
queues.c Merge 10.4 into 10.5 2020-05-05 21:16:22 +03:00
safemalloc.c Merge 10.4 into 10.5 2021-10-28 08:48:36 +03:00
stacktrace.c Merge 10.4 into 10.5 2020-08-20 12:52:44 +03:00
string.c perfschema memory related instrumentation changes 2020-03-10 19:24:22 +01:00
test_charset.c
test_dir.c
test_thr_mutex.c
test_xml.c
testhash.c
thr_alarm.c perfschema memory related instrumentation changes 2020-03-10 19:24:22 +01:00
thr_lock.c Merge 10.4 into 10.5 2021-05-03 14:34:48 +03:00
thr_mutex.c Added DBUG_PUSH_EMPTY and DBUG_POP_EMPTY to speed up DBUG 2020-08-20 19:34:11 +03:00
thr_rwlock.c MDEV-19773 : simplify implementation of Windows rwlock 2019-06-18 00:37:09 +01:00
thr_timer.c MDEV-16264 - prerequisite patch, periodic thr_timer 2019-11-15 16:50:22 +01:00
tree.c perfschema memory related instrumentation changes 2020-03-10 19:24:22 +01:00
typelib.c Added 'const' to arguments in get_one_option and find_typeset() 2021-02-08 12:16:29 +02:00
waiting_threads.c Merge 10.4 into 10.5 2020-04-25 21:57:52 +03:00
wqueue.c