diff options
author | Anurag Gupta <anugupta@microsoft.com> | 2014-05-06 13:33:47 -0700 |
---|---|---|
committer | Anurag Gupta <anugupta@microsoft.com> | 2014-05-06 13:41:07 -0700 |
commit | 0bf5430dc77c69d2b2d27a771b584b17cedb97ec (patch) | |
tree | e81c712e697d9260440ec5e2f39319b8ff14b673 | |
parent | 001befcdd5a208a046e0196e3fec7b16041cfe14 (diff) | |
download | libgit2-0bf5430dc77c69d2b2d27a771b584b17cedb97ec.tar.gz |
Fix the issues in git_shutdown
1) Call to git_shutdown results in setting git__n_shutdown_callbacks
to -1. Next call to git__on_shutdown results in ABW (Array Bound Write)
for array git__shutdown_callbacks. In the current Implementation,
git_atomic_dec is called git__n_shutdown_callbacks + 1 times. I have
modified it to a for loop so that it is more readable. It would not
set git__n_shutdown_callbacks to a negative number and reset the
elements of git__shutdown_callbacks to NULL.
2) In function git_sysdir_get, shutdown function is registered only if
git_sysdir__dirs_shutdown_set is set to 0. However, after this variable
is set to 1, it is never reset to 0. If git_sysdir_global_init is
called again from synchronized_threads_init it does not register
shutdown function for this subsystem.
-rw-r--r-- | src/global.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/global.c b/src/global.c index a64dce9ef..4dfdcf438 100644 --- a/src/global.c +++ b/src/global.c @@ -31,11 +31,11 @@ static void git__shutdown(void) { int pos; - for (pos = git_atomic_get(&git__n_shutdown_callbacks); pos > 0; pos = git_atomic_dec(&git__n_shutdown_callbacks)) - if (git__shutdown_callbacks[pos - 1]) { - git__shutdown_callbacks[pos - 1](); - git__shutdown_callbacks[pos - 1] = NULL; - } + for (pos = git_atomic_get(&git__n_shutdown_callbacks); pos > 0; pos = git_atomic_dec(&git__n_shutdown_callbacks)) { + git_global_shutdown_fn cb = git__swap(git__shutdown_callbacks[pos - 1], NULL); + if (cb != NULL) + cb(); + } } |