Always check the result of git_mutex_lock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
diff --git a/src/cache.c b/src/cache.c
index edd3a47..6780175 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -52,7 +52,11 @@ void *git_cache_get(git_cache *cache, const git_oid *oid)
memcpy(&hash, oid->id, sizeof(hash));
- git_mutex_lock(&cache->lock);
+ if (git_mutex_lock(&cache->lock)) {
+ giterr_set(GITERR_THREAD, "unable to lock cache mutex");
+ return NULL;
+ }
+
{
node = cache->nodes[hash & cache->size_mask];
@@ -73,12 +77,16 @@ void *git_cache_try_store(git_cache *cache, void *_entry)
memcpy(&hash, &entry->oid, sizeof(uint32_t));
- /* increase the refcount on this object, because
- * the cache now owns it */
- git_cached_obj_incref(entry);
+ if (git_mutex_lock(&cache->lock)) {
+ giterr_set(GITERR_THREAD, "unable to lock cache mutex");
+ return NULL;
+ }
- git_mutex_lock(&cache->lock);
{
+ /* increase the refcount on this object, because
+ * the cache now owns it */
+ git_cached_obj_incref(entry);
+
git_cached_obj *node = cache->nodes[hash & cache->size_mask];
if (node == NULL) {
diff --git a/src/mwindow.c b/src/mwindow.c
index 4da5bad..ee693e4 100644
--- a/src/mwindow.c
+++ b/src/mwindow.c
@@ -44,7 +44,10 @@ void git_mwindow_free_all(git_mwindow_file *mwf)
git_mwindow_ctl *ctl = &mem_ctl;
unsigned int i;
- git_mutex_lock(&git__mwindow_mutex);
+ if (git_mutex_lock(&git__mwindow_mutex)) {
+ giterr_set(GITERR_THREAD, "unable to lock mwindow mutex");
+ return;
+ }
/*
* Remove these windows from the global list
@@ -221,7 +224,11 @@ unsigned char *git_mwindow_open(
git_mwindow_ctl *ctl = &mem_ctl;
git_mwindow *w = *cursor;
- git_mutex_lock(&git__mwindow_mutex);
+ if (git_mutex_lock(&git__mwindow_mutex)) {
+ giterr_set(GITERR_THREAD, "unable to lock mwindow mutex");
+ return NULL;
+ }
+
if (!w || !(git_mwindow_contains(w, offset) && git_mwindow_contains(w, offset + extra))) {
if (w) {
w->inuse_cnt--;
@@ -269,7 +276,11 @@ int git_mwindow_file_register(git_mwindow_file *mwf)
git_mwindow_ctl *ctl = &mem_ctl;
int ret;
- git_mutex_lock(&git__mwindow_mutex);
+ if (git_mutex_lock(&git__mwindow_mutex)) {
+ giterr_set(GITERR_THREAD, "unable to lock mwindow mutex");
+ return -1;
+ }
+
if (ctl->windowfiles.length == 0 &&
git_vector_init(&ctl->windowfiles, 8, NULL) < 0) {
git_mutex_unlock(&git__mwindow_mutex);
@@ -288,7 +299,11 @@ int git_mwindow_file_deregister(git_mwindow_file *mwf)
git_mwindow_file *cur;
unsigned int i;
- git_mutex_lock(&git__mwindow_mutex);
+ if (git_mutex_lock(&git__mwindow_mutex)) {
+ giterr_set(GITERR_THREAD, "unable to lock mwindow mutex");
+ return -1;
+ }
+
git_vector_foreach(&ctl->windowfiles, i, cur) {
if (cur == mwf) {
git_vector_remove(&ctl->windowfiles, i);
@@ -306,7 +321,11 @@ void git_mwindow_close(git_mwindow **window)
{
git_mwindow *w = *window;
if (w) {
- git_mutex_lock(&git__mwindow_mutex);
+ if (git_mutex_lock(&git__mwindow_mutex)) {
+ giterr_set(GITERR_THREAD, "unable to lock mwindow mutex");
+ return;
+ }
+
w->inuse_cnt--;
git_mutex_unlock(&git__mwindow_mutex);
*window = NULL;
diff --git a/src/pack-objects.c b/src/pack-objects.c
index 44ad3fd..2eb6976 100644
--- a/src/pack-objects.c
+++ b/src/pack-objects.c
@@ -1025,6 +1025,14 @@ static void *threaded_find_deltas(void *arg)
git_cond_signal(&me->pb->progress_cond);
git_packbuilder__progress_unlock(me->pb);
+ if (git_mutex_lock(&me->mutex)) {
+ giterr_set(GITERR_THREAD, "unable to lock packfile condition mutex");
+ return NULL;
+ }
+
+ while (!me->data_ready)
+ git_cond_wait(&me->cond, &me->mutex);
+
/*
* We must not set ->data_ready before we wait on the
* condition because the main thread may have set it to 1
@@ -1033,9 +1041,6 @@ static void *threaded_find_deltas(void *arg)
* was initialized to 0 before this thread was spawned
* and we reset it to 0 right away.
*/
- git_mutex_lock(&me->mutex);
- while (!me->data_ready)
- git_cond_wait(&me->cond, &me->mutex);
me->data_ready = 0;
git_mutex_unlock(&me->mutex);
}
@@ -1168,7 +1173,12 @@ static int ll_find_deltas(git_packbuilder *pb, git_pobject **list,
target->working = 1;
git_packbuilder__progress_unlock(pb);
- git_mutex_lock(&target->mutex);
+ if (git_mutex_lock(&target->mutex)) {
+ giterr_set(GITERR_THREAD, "unable to lock packfile condition mutex");
+ git__free(p);
+ return -1;
+ }
+
target->data_ready = 1;
git_cond_signal(&target->cond);
git_mutex_unlock(&target->mutex);