mirror of
				https://git.proxmox.com/git/libgit2
				synced 2025-11-04 03:05:04 +00:00 
			
		
		
		
	Always check the result of git_mutex_lock
This commit is contained in:
		
							parent
							
								
									c3320aca76
								
							
						
					
					
						commit
						a35b386458
					
				
							
								
								
									
										18
									
								
								src/cache.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								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) {
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user