summaryrefslogtreecommitdiff
path: root/tests/diff/diffiter.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2018-05-04 13:40:54 +0100
committerPatrick Steinhardt <ps@pks.im>2018-05-04 13:40:54 +0100
commit0933fdc5f5db346ff0fe9e1614bf2a54e96acba9 (patch)
tree3a18ce322e1f0ff7232002772971215794c00cad /tests/diff/diffiter.c
parent0fd0bfe435989b4947babfcd61b0bf573ff41e28 (diff)
downloadlibgit2-0933fdc5f5db346ff0fe9e1614bf2a54e96acba9.tar.gz
global: adjust init count under lock
Our global initialization functions `git_libgit2_init()` and `git_libgit2_shutdown()` both adjust a global init counter to determine whether we are the first respectively last user of libgit2. On Unix-systems do not do so under lock, though, which opens the possibility of a race between these two functions: Thread 1 Thread 2 git__n_inits = 0; git_libgit2_init(); git_atomic_inc(&git__n_inits); /* git__n_inits == 1 */ git_libgit2_shutdown(); if (git_atomic_dec(&git__n_inits) != 0) /* git__n_inits == 0, no early exit here */ pthread_mutex_lock(&_init_mutex); shutdown_common(); pthread_mutex_unlock(&_init_mutex); pthread_mutex_lock(&_init_mutex); init_once(); pthread_mutex_unlock(&_init_mutex); So we can end up in a situation where we try to shutdown shared data structures before they have been initialized. Fix the race by always locking `_init_mutex` before incrementing or decrementing `git__n_inits`.
Diffstat (limited to 'tests/diff/diffiter.c')
0 files changed, 0 insertions, 0 deletions