Commit 0652abaaeaff768e78a65464e59bd1896ce2f6ce

Patrick Steinhardt 2018-07-20T12:56:49

Merge pull request #4702 from tiennou/fix/coverity Assorted Coverity fixes

diff --git a/src/blame.c b/src/blame.c
index fc87bd1..7a81a23 100644
--- a/src/blame.c
+++ b/src/blame.c
@@ -133,8 +133,11 @@ git_blame* git_blame__alloc(
 		return NULL;
 	}
 
-	if (opts.flags & GIT_BLAME_USE_MAILMAP)
-		git_mailmap_from_repository(&gbr->mailmap, repo);
+	if (opts.flags & GIT_BLAME_USE_MAILMAP &&
+	    git_mailmap_from_repository(&gbr->mailmap, repo) < 0) {
+		git_blame_free(gbr);
+		return NULL;
+	}
 
 	return gbr;
 }
diff --git a/src/submodule.c b/src/submodule.c
index d0c7d04..3cbddfa 100644
--- a/src/submodule.c
+++ b/src/submodule.c
@@ -260,7 +260,8 @@ static int load_submodule_names(git_strmap **out, git_repository *repo, git_conf
 		git_strmap_insert(names, entry->value, git_buf_detach(&buf), &rval);
 		if (rval < 0) {
 			giterr_set(GITERR_NOMEMORY, "error inserting submodule into hash table");
-			return -1;
+			error = -1;
+			goto out;
 		}
 	}
 	if (error == GIT_ITEROVER)
diff --git a/src/transports/smart.c b/src/transports/smart.c
index 69c129b..be3f9c8 100644
--- a/src/transports/smart.c
+++ b/src/transports/smart.c
@@ -279,30 +279,34 @@ static int git_smart__connect(
 		return error;
 
 	/* Detect capabilities */
-	if (git_smart__detect_caps(first, &t->caps, &symrefs) < 0) {
-		free_symrefs(&symrefs);
-		return -1;
-	}
+	if ((error = git_smart__detect_caps(first, &t->caps, &symrefs)) == 0) {
+		/* If the only ref in the list is capabilities^{} with OID_ZERO, remove it */
+		if (1 == t->refs.length && !strcmp(first->head.name, "capabilities^{}") &&
+			git_oid_iszero(&first->head.oid)) {
+			git_vector_clear(&t->refs);
+			git_pkt_free((git_pkt *)first);
+		}
 
-	/* If the only ref in the list is capabilities^{} with OID_ZERO, remove it */
-	if (1 == t->refs.length && !strcmp(first->head.name, "capabilities^{}") &&
-		git_oid_iszero(&first->head.oid)) {
-		git_vector_clear(&t->refs);
-		git_pkt_free((git_pkt *)first);
+		/* Keep a list of heads for _ls */
+		git_smart__update_heads(t, &symrefs);
+	} else if (error == GIT_ENOTFOUND) {
+		/* There was no ref packet received, or the cap list was empty */
+		error = 0;
+	} else {
+		giterr_set(GITERR_NET, "invalid response");
+		goto cleanup;
 	}
 
-	/* Keep a list of heads for _ls */
-	git_smart__update_heads(t, &symrefs);
-
-	free_symrefs(&symrefs);
-
-	if (t->rpc && git_smart__reset_stream(t, false) < 0)
-		return -1;
+	if (t->rpc && (error = git_smart__reset_stream(t, false)) < 0)
+		goto cleanup;
 
 	/* We're now logically connected. */
 	t->connected = 1;
 
-	return 0;
+cleanup:
+	free_symrefs(&symrefs);
+
+	return error;
 }
 
 static int git_smart__ls(const git_remote_head ***out, size_t *size, git_transport *transport)
diff --git a/src/transports/smart_protocol.c b/src/transports/smart_protocol.c
index 716aa45..ce63cb1 100644
--- a/src/transports/smart_protocol.c
+++ b/src/transports/smart_protocol.c
@@ -136,7 +136,7 @@ int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps, git_vec
 
 	/* No refs or capabilites, odd but not a problem */
 	if (pkt == NULL || pkt->capabilities == NULL)
-		return 0;
+		return GIT_ENOTFOUND;
 
 	ptr = pkt->capabilities;
 	while (ptr != NULL && *ptr != '\0') {
diff --git a/tests/checkout/conflict.c b/tests/checkout/conflict.c
index 9b86cfa..90603d4 100644
--- a/tests/checkout/conflict.c
+++ b/tests/checkout/conflict.c
@@ -93,7 +93,7 @@ static void create_index(struct checkout_index_entry *entries, size_t entries_le
 		if (entries[i].stage == 3 && (i == 0 || strcmp(entries[i-1].path, entries[i].path) != 0 || entries[i-1].stage != 2))
 			p_unlink(git_buf_cstr(&path));
 
-		git_index_remove_bypath(g_index, entries[i].path);
+		cl_git_pass(git_index_remove_bypath(g_index, entries[i].path));
 	}
 
 	for (i = 0; i < entries_len; i++) {
@@ -133,7 +133,7 @@ static void create_conflicting_index(void)
 	};
 
 	create_index(checkout_index_entries, 3);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 }
 
 static void ensure_workdir_contents(const char *path, const char *contents)
@@ -271,7 +271,7 @@ void test_checkout_conflict__automerge(void)
 	};
 
 	create_index(checkout_index_entries, 3);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
@@ -303,7 +303,7 @@ void test_checkout_conflict__directory_file(void)
 	opts.checkout_strategy |= GIT_CHECKOUT_SAFE;
 
 	create_index(checkout_index_entries, 12);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
@@ -344,7 +344,7 @@ void test_checkout_conflict__directory_file_with_custom_labels(void)
 	opts.their_label = "branch";
 
 	create_index(checkout_index_entries, 12);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
@@ -383,7 +383,7 @@ void test_checkout_conflict__link_file(void)
 	opts.checkout_strategy |= GIT_CHECKOUT_SAFE;
 
 	create_index(checkout_index_entries, 12);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
@@ -410,7 +410,7 @@ void test_checkout_conflict__links(void)
 	opts.checkout_strategy |= GIT_CHECKOUT_SAFE;
 
 	create_index(checkout_index_entries, 5);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
@@ -431,7 +431,7 @@ void test_checkout_conflict__add_add(void)
 	opts.checkout_strategy |= GIT_CHECKOUT_SAFE;
 
 	create_index(checkout_index_entries, 2);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
@@ -472,7 +472,7 @@ void test_checkout_conflict__mode_change(void)
 	opts.checkout_strategy |= GIT_CHECKOUT_SAFE;
 
 	create_index(checkout_index_entries, 18);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
@@ -604,7 +604,7 @@ void test_checkout_conflict__renames(void)
 
 	create_index(checkout_index_entries, 41);
 	create_index_names(checkout_name_entries, 9);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
@@ -789,7 +789,7 @@ void test_checkout_conflict__rename_keep_ours(void)
 	
 	create_index(checkout_index_entries, 41);
 	create_index_names(checkout_name_entries, 9);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 	
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 		
@@ -922,7 +922,7 @@ void test_checkout_conflict__name_mangled_file_exists_in_workdir(void)
 
 	create_index(checkout_index_entries, 24);
 	create_index_names(checkout_name_entries, 6);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	/* Add some files on disk that conflict with the names that would be chosen
 	 * for the files written for each side. */
@@ -1012,7 +1012,7 @@ void test_checkout_conflict__update_only(void)
 	opts.checkout_strategy |= GIT_CHECKOUT_UPDATE_ONLY;
 
 	create_index(checkout_index_entries, 3);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(p_mkdir("merge-resolve/directory_file-two", 0777));
 	cl_git_rewritefile("merge-resolve/directory_file-two/file", CONFLICTING_OURS_FILE);
@@ -1063,7 +1063,7 @@ void test_checkout_conflict__path_filters(void)
 	opts.paths = patharray;
 
 	create_index(checkout_index_entries, 12);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
@@ -1120,7 +1120,7 @@ void test_checkout_conflict__report_progress(void)
 
 
 	create_index(checkout_index_entries, 12);
-	git_index_write(g_index);
+	cl_git_pass(git_index_write(g_index));
 
 	cl_git_pass(git_checkout_index(g_repo, g_index, &opts));
 
diff --git a/tests/checkout/tree.c b/tests/checkout/tree.c
index a69574b..4008935 100644
--- a/tests/checkout/tree.c
+++ b/tests/checkout/tree.c
@@ -954,7 +954,7 @@ static void create_conflict(const char *path)
 	git_oid_fromstr(&entry.id, "2bd0a343aeef7a2cf0d158478966a6e587ff3863");
 	cl_git_pass(git_index_add(index, &entry));
 
-	git_index_write(index);
+	cl_git_pass(git_index_write(index));
 	git_index_free(index);
 }
 
@@ -1127,7 +1127,7 @@ void test_checkout_tree__removes_conflicts(void)
 	create_conflict("other.txt");
 	cl_git_mkfile("testrepo/other.txt", "This is another conflict file.\n");
 
-	git_index_write(index);
+	cl_git_pass(git_index_write(index));
 
 	cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts));
 
@@ -1172,7 +1172,7 @@ void test_checkout_tree__removes_conflicts_only_by_pathscope(void)
 	create_conflict("other.txt");
 	cl_git_mkfile("testrepo/other.txt", "This is another conflict file.\n");
 
-	git_index_write(index);
+	cl_git_pass(git_index_write(index));
 
 	cl_git_pass(git_checkout_tree(g_repo, (const git_object *)commit, &opts));
 
diff --git a/tests/describe/t6120.c b/tests/describe/t6120.c
index 65e8582..5ec176b 100644
--- a/tests/describe/t6120.c
+++ b/tests/describe/t6120.c
@@ -104,8 +104,8 @@ static void commit_and_tag(
 
 	cl_git_append2file("describe/file", "\n");
 	
-	git_index_add_bypath(index, "describe/file");
-	git_index_write(index);
+	cl_git_pass(git_index_add_bypath(index, "file"));
+	cl_git_pass(git_index_write(index));
 
 	*time += 10;
 	cl_repo_commit_from_index(&commit_id, repo, NULL, *time, commit_msg);
diff --git a/tests/diff/workdir.c b/tests/diff/workdir.c
index d827062..dab6147 100644
--- a/tests/diff/workdir.c
+++ b/tests/diff/workdir.c
@@ -1910,7 +1910,7 @@ void test_diff_workdir__binary_detection(void)
 		cl_git_write2file(
 			b.ptr, data[i].ptr, data[i].size, O_WRONLY|O_TRUNC, 0664);
 	}
-	git_index_write(idx);
+	cl_git_pass(git_index_write(idx));
 
 	cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL));
 
@@ -1938,7 +1938,7 @@ void test_diff_workdir__binary_detection(void)
 
 		cl_git_write2file(b.ptr, "baseline\n", 9, O_WRONLY|O_TRUNC, 0664);
 	}
-	git_index_write(idx);
+	cl_git_pass(git_index_write(idx));
 
 	cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL));
 
diff --git a/tests/mailmap/parsing.c b/tests/mailmap/parsing.c
index 4479e41..dc5096c 100644
--- a/tests/mailmap/parsing.c
+++ b/tests/mailmap/parsing.c
@@ -86,7 +86,7 @@ void test_mailmap_parsing__windows_string(void)
 
 	/* Parse with windows-style line endings */
 	git_buf_attach_notowned(&unixbuf, string_mailmap, strlen(string_mailmap));
-	git_buf_text_lf_to_crlf(&winbuf, &unixbuf);
+	cl_git_pass(git_buf_text_lf_to_crlf(&winbuf, &unixbuf));
 
 	cl_git_pass(git_mailmap_from_buffer(&g_mailmap, winbuf.ptr, winbuf.size));
 	git_buf_dispose(&winbuf);
diff --git a/tests/merge/workdir/dirty.c b/tests/merge/workdir/dirty.c
index 66301e1..dd7267b 100644
--- a/tests/merge/workdir/dirty.c
+++ b/tests/merge/workdir/dirty.c
@@ -337,7 +337,7 @@ void test_merge_workdir_dirty__identical_staged_files_allowed(void)
 	for (i = 0, content = result_contents[i]; content[0]; content = result_contents[++i]) {
 		stage_content(content);
 
-		git_index_write(repo_index);
+		cl_git_pass(git_index_write(repo_index));
 		cl_git_pass(merge_branch());
 	}
 }
diff --git a/tests/stash/apply.c b/tests/stash/apply.c
index 16cb140..063223a 100644
--- a/tests/stash/apply.c
+++ b/tests/stash/apply.c
@@ -34,7 +34,7 @@ void test_stash_apply__initialize(void)
 	cl_git_pass(git_index_add_bypath(repo_index, "who"));
 	cl_git_pass(git_index_add_bypath(repo_index, "why"));
 	cl_git_pass(git_index_add_bypath(repo_index, "where"));
-	git_index_write(repo_index);
+	cl_git_pass(git_index_write(repo_index));
 
 	cl_git_rewritefile("stash/where", "....\n");