From: Mathieu Desnoyers Date: Mon, 7 May 2012 23:07:35 +0000 (-0400) Subject: rculfhash: fix: race between replace and del operations X-Git-Tag: v0.7.0~17 X-Git-Url: http://git.liburcu.org/?a=commitdiff_plain;h=71bb3aca70894bd78ec75f47c0c464261ad1dc86;hp=71bb3aca70894bd78ec75f47c0c464261ad1dc86;p=urcu.git rculfhash: fix: race between replace and del operations Bug introduced by commit db00ccc36e7fb04ce8044fb1be7964acd1de6ae0 Here is the race: Initially in hash table: A T0 T1 replace A by B del A read A->next -> check REMOVED flag, not set yet. read A->next -> check REMOVED flag, not set yet. cmpxchg A->next to set REMOVED flag -> cmpxchg succeeds uatomic_or to set REMOVED flag uatomic_xchg to atomically set the REMOVAL_OWNER flag -> first to set the flag. Replace returns node -> free(A) Del success -> free(A) With this race, we have a double-free. The problem with the replace code is that it does not set the "REMOVAL_OWNER" flag. Test case to reproduce the bug: test_urcu_hash 0 2 20 -A -s -M 1 -N 1 -O 1 (2 threads, doing replace/del, with a hash table that has only a single key for all values). After just a couple of seconds, either the program hangs, or, more often, it does: *** glibc detected *** /media/truecrypt1/compudj/doc/userspace-rcu/tests/.libs/test_urcu_hash: malloc(): memory corruption (fast): 0x00007ffff3a29e25 *** Program received signal SIGSEGV, Segmentation fault. Signed-off-by: Mathieu Desnoyers Tested-by: Mathieu Desnoyers ---