I'm on today's devel, and this TSAN-reported data race looks valid (the session status is indeed accessed without lock):
WARNING: ThreadSanitizer: data race (pid=6778)
Read of size 4 at 0x7b4c00020ec0 by thread T6 (mutexes: write M0):
#0 nc_server_ch_client_thread_session_cond_wait /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4099:18 (test_ch+0x50010a) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 nc_ch_client_thread /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4313:17 (test_ch+0x50010a)
Previous write of size 4 at 0x7b4c00020ec0 by thread T5:
#0 nc_server_send_reply_io /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:2602:25 (test_ch+0x4fbe82) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 nc_ps_poll /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:3003:20 (test_ch+0x4fbb45) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#2 server_thread_tls /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/tests/test_ch.c:277:15 (test_ch+0x53b1e4) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
Location is heap block of size 440 at 0x7b4c00020ec0 allocated by thread T6:
#0 calloc <null> (test_ch+0x456d1a) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 nc_new_session /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session.c:265:12 (test_ch+0x4e868a) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#2 nc_connect_ch_endpt /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:3880:16 (test_ch+0x4ff6d2) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#3 nc_ch_client_thread /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4293:19 (test_ch+0x4ff6d2)
Mutex M0 (0x7b4c00021000) created at:
#0 pthread_mutex_init <null> (test_ch+0x45a1c4) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 nc_new_session /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session.c:277:9 (test_ch+0x4e86e5) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#2 nc_connect_ch_endpt /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:3880:16 (test_ch+0x4ff6d2) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#3 nc_ch_client_thread /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4293:19 (test_ch+0x4ff6d2)
Thread T6 (tid=6970, running) created by thread T5 at:
#0 pthread_create <null> (test_ch+0x4587ff) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 _nc_connect_ch_client_dispatch /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4642:14 (test_ch+0x4ff2dc) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#2 nc_connect_ch_client_dispatch /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4688:10 (test_ch+0x5007f7) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#3 server_thread_tls /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/tests/test_ch.c:271:11 (test_ch+0x53b1aa) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
Thread T5 (tid=6969, running) created by main thread at:
#0 pthread_create <null> (test_ch+0x4587ff) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 test_nc_ch_tls /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/tests/test_ch.c:340:11 (test_ch+0x5399ef) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#2 <null> <null> (libcmocka.so.0+0x618f) (BuildId: 785844a0941c0bde763740a981d056f60aa9c7b7)
#3 __libc_start_call_main /usr/src/debug/glibc-2.37-18.fc38.x86_64/csu/../sysdeps/nptl/libc_start_call_main.h:58:16 (libc.so.6+0x27b89) (BuildId: 70e92bb237883be3065a6afc9f0696aef2d068bf)
A different place, but the same race:
WARNING: ThreadSanitizer: data race (pid=6778)
Write of size 1 at 0x7b4c00020f50 by thread T6 (mutexes: write M0):
#0 nc_server_ch_client_thread_session_cond_wait /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4106:20 (test_ch+0x50015c) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 nc_ch_client_thread /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4313:17 (test_ch+0x50015c)
Previous read of size 1 at 0x7b4c00020f50 by thread T5:
#0 nc_ps_poll_session_io /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:2666:20 (test_ch+0x4faf61) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 nc_ps_poll_sess /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:2833:19 (test_ch+0x4faf61)
#2 nc_ps_poll /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:2929:23 (test_ch+0x4faf61)
#3 server_thread_tls /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/tests/test_ch.c:277:15 (test_ch+0x53b1e4) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
Location is heap block of size 440 at 0x7b4c00020ec0 allocated by thread T6:
#0 calloc <null> (test_ch+0x456d1a) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 nc_new_session /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session.c:265:12 (test_ch+0x4e868a) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#2 nc_connect_ch_endpt /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:3880:16 (test_ch+0x4ff6d2) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#3 nc_ch_client_thread /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4293:19 (test_ch+0x4ff6d2)
Mutex M0 (0x7b4c00021000) created at:
#0 pthread_mutex_init <null> (test_ch+0x45a1c4) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 nc_new_session /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session.c:277:9 (test_ch+0x4e86e5) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#2 nc_connect_ch_endpt /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:3880:16 (test_ch+0x4ff6d2) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#3 nc_ch_client_thread /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4293:19 (test_ch+0x4ff6d2)
Thread T6 (tid=6970, running) created by thread T5 at:
#0 pthread_create <null> (test_ch+0x4587ff) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 _nc_connect_ch_client_dispatch /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4642:14 (test_ch+0x4ff2dc) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#2 nc_connect_ch_client_dispatch /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4688:10 (test_ch+0x5007f7) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#3 server_thread_tls /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/tests/test_ch.c:271:11 (test_ch+0x53b1aa) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
Thread T5 (tid=6969, running) created by main thread at:
#0 pthread_create <null> (test_ch+0x4587ff) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#1 test_nc_ch_tls /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/tests/test_ch.c:340:11 (test_ch+0x5399ef) (BuildId: d0269f048ba46cb63d3e1f0a8c946c415cf3488f)
#2 <null> <null> (libcmocka.so.0+0x618f) (BuildId: 785844a0941c0bde763740a981d056f60aa9c7b7)
#3 __libc_start_call_main /usr/src/debug/glibc-2.37-18.fc38.x86_64/csu/../sysdeps/nptl/libc_start_call_main.h:58:16 (libc.so.6+0x27b89) (BuildId: 70e92bb237883be3065a6afc9f0696aef2d068bf)
SUMMARY: ThreadSanitizer: data race /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/libnetconf2/src/session_server.c:4106:20 in nc_server_ch_client_thread_session_cond_wait
Full log is here, it happens in the test_ch test.
I'm on today's devel, and this TSAN-reported data race looks valid (the session status is indeed accessed without lock):
A different place, but the same race:
Full log is here, it happens in the
test_chtest.