[Bug 261713] ThreadSanitizer detects race in __catopen_l (via strerror_r)
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 261713] ThreadSanitizer detects race in __catopen_l (via strerror_r)"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 261713] ThreadSanitizer detects race in __catopen_l (via strerror_r)"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 261713] ThreadSanitizer detects race in __catopen_l (via strerror_r)"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 04 Feb 2022 15:21:20 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=261713 Bug ID: 261713 Summary: ThreadSanitizer detects race in __catopen_l (via strerror_r) Product: Base System Version: CURRENT Hardware: Any OS: Any Status: New Severity: Affects Some People Priority: --- Component: threads Assignee: threads@FreeBSD.org Reporter: dim@FreeBSD.org Test case: ====================================================================== #include <err.h> #include <errno.h> #include <pthread.h> #include <stdio.h> #include <string.h> #include <unistd.h> #define NUM_THREADS 2 static void *thread_func(void *arg __attribute__((__unused__))) { char buf[256]; int error; usleep(1); error = strerror_r(ETIMEDOUT, buf, sizeof buf); if (error) errx(1, "strerror_r failed with error %d", error); return NULL; } int main(void) { pthread_t threads[NUM_THREADS]; int i, error; void *result; for (i = 0; i < NUM_THREADS; ++i) { error = pthread_create(&threads[i], NULL, thread_func, NULL); if (error) errx(1, "pthread_create failed with error %d", error); } for (i = 0; i < NUM_THREADS; ++i) { error = pthread_join(threads[i], &result); if (error) errx(1, "pthread_join failed with error %d", error); } return 0; } ====================================================================== % uname -v FreeBSD 14.0-CURRENT #2 main-n252774-fdf278410104: Sun Jan 30 21:44:57 CET 2022 dim@vdim-fbsdhead-amd64:/usr/obj/usr/src/amd64.amd64/sys/GENERIC % cc -g fsanitize=thread race-strerror.c -o race-strerror -lpthread % ./race-strerror ================== WARNING: ThreadSanitizer: data race (pid=3438) Read of size 1 at 0x7b0400000000 by thread T2: #0 strcmp /usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:457:3 (race-strerror+0x25fdcf) #1 __catopen_l /usr/src/lib/libc/nls/msgcat.c:163:8 (libc.so.7+0xfb2ad) #2 thread_func /share/dim/bugs/race-strerror/race-strerror.c:17:11 (race-strerror+0x2bac75) Previous write of size 1 at 0x7b0400000000 by thread T1: #0 memcpy /usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:827:5 (race-strerror+0x261b9b) #1 strdup /usr/src/lib/libc/string/strdup.c:51:2 (libc.so.7+0x1d39b6) #2 __catopen_l /usr/src/lib/libc/nls/msgcat.c:273:2 (libc.so.7+0xfb6a4) #3 thread_func /share/dim/bugs/race-strerror/race-strerror.c:17:11 (race-strerror+0x2bac75) As if synchronized via sleep: #0 usleep /usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:356:3 (race-strerror+0x257476) #1 thread_func /share/dim/bugs/race-strerror/race-strerror.c:15:3 (race-strerror+0x2bac5f) Location is heap block of size 5 at 0x7b0400000000 allocated by thread T1: #0 malloc /usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:655:5 (race-strerror+0x2586fa) #1 strdup /usr/src/lib/libc/string/strdup.c:49:14 (libc.so.7+0x1d39a0) #2 __catopen_l /usr/src/lib/libc/nls/msgcat.c:273:2 (libc.so.7+0xfb6a4) #3 thread_func /share/dim/bugs/race-strerror/race-strerror.c:17:11 (race-strerror+0x2bac75) Thread T2 (tid=100539, running) created by main thread at: #0 pthread_create /usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:977:3 (race-strerror+0x259c15) #1 main /share/dim/bugs/race-strerror/race-strerror.c:31:13 (race-strerror+0x2bab8d) Thread T1 (tid=100538, finished) created by main thread at: #0 pthread_create /usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:977:3 (race-strerror+0x259c15) #1 main /share/dim/bugs/race-strerror/race-strerror.c:31:13 (race-strerror+0x2bab8d) SUMMARY: ThreadSanitizer: data race /usr/src/lib/libc/nls/msgcat.c:163:8 in __catopen_l ================== ================== WARNING: ThreadSanitizer: data race (pid=3438) Read of size 1 at 0x7b0400000010 by thread T2: #0 strcmp /usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:457:3 (race-strerror+0x25fdcf) #1 __catopen_l /usr/src/lib/libc/nls/msgcat.c:165:7 (libc.so.7+0xfb2ca) #2 thread_func /share/dim/bugs/race-strerror/race-strerror.c:17:11 (race-strerror+0x2bac75) Previous write of size 8 at 0x7b0400000010 by thread T1: #0 malloc /usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:655:5 (race-strerror+0x2586fa) #1 strdup /usr/src/lib/libc/string/strdup.c:49:14 (libc.so.7+0x1d39a0) #2 __catopen_l /usr/src/lib/libc/nls/msgcat.c:273:2 (libc.so.7+0xfb6c4) #3 thread_func /share/dim/bugs/race-strerror/race-strerror.c:17:11 (race-strerror+0x2bac75) As if synchronized via sleep: #0 usleep /usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:356:3 (race-strerror+0x257476) #1 thread_func /share/dim/bugs/race-strerror/race-strerror.c:15:3 (race-strerror+0x2bac5f) Location is heap block of size 2 at 0x7b0400000010 allocated by thread T1: #0 malloc /usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:655:5 (race-strerror+0x2586fa) #1 strdup /usr/src/lib/libc/string/strdup.c:49:14 (libc.so.7+0x1d39a0) #2 __catopen_l /usr/src/lib/libc/nls/msgcat.c:273:2 (libc.so.7+0xfb6c4) #3 thread_func /share/dim/bugs/race-strerror/race-strerror.c:17:11 (race-strerror+0x2bac75) Thread T2 (tid=100539, running) created by main thread at: #0 pthread_create /usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:977:3 (race-strerror+0x259c15) #1 main /share/dim/bugs/race-strerror/race-strerror.c:31:13 (race-strerror+0x2bab8d) Thread T1 (tid=100538, finished) created by main thread at: #0 pthread_create /usr/src/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp:977:3 (race-strerror+0x259c15) #1 main /share/dim/bugs/race-strerror/race-strerror.c:31:13 (race-strerror+0x2bab8d) SUMMARY: ThreadSanitizer: data race /usr/src/lib/libc/nls/msgcat.c:165:7 in __catopen_l ================== ThreadSanitizer: reported 2 warnings E.g. thread T2 is looping over the cache in lib/libc/nls/msgcat.c, line 163: 160 /* Try to get it from the cache first */ 161 RLOCK(NLERR); 162 SLIST_FOREACH(np, &cache, list) { -> 163 if ((strcmp(np->name, name) == 0) && 164 ((lang != NULL && np->lang != NULL && 165 strcmp(np->lang, lang) == 0) || (np->lang == lang))) { while thread T1 is still allocating memory in the SAVEFAIL macro, line 273: 271 free(plang); 272 free(base); -> 273 SAVEFAIL(name, lang, ENOENT); 274 NLRETERR(ENOENT); 275 } But it's tricky to see what happens exactly, since SAVEFAIL does quite a lot of things. :) -- You are receiving this mail because: You are the assignee for the bug.