Commit 7cd4ba1b17d579134ac6cc172fc858021d4aa407

Carlos Martín Nieto 2015-05-22T12:11:42

refspec: make sure matching refspecs have src, dst and input strings When we find out that we're dealing with a matching refspec, we set the flag and return immediately. This leaves the strings as NULL, which breaks the contract. Assign these pointers to a string with the correct values.

diff --git a/src/refspec.c b/src/refspec.c
index ad81412..961f939 100644
--- a/src/refspec.c
+++ b/src/refspec.c
@@ -42,6 +42,12 @@ int git_refspec__parse(git_refspec *refspec, const char *input, bool is_fetch)
 	 */
 	if (!is_fetch && rhs == lhs && rhs[1] == '\0') {
 		refspec->matching = 1;
+		refspec->string = git__strdup(input);
+		GITERR_CHECK_ALLOC(refspec->string);
+		refspec->src = git__strdup("");
+		GITERR_CHECK_ALLOC(refspec->src);
+		refspec->dst = git__strdup("");
+		GITERR_CHECK_ALLOC(refspec->dst);
 		return 0;
 	}
 
diff --git a/tests/network/refspecs.c b/tests/network/refspecs.c
index c6bcb10..614d91d 100644
--- a/tests/network/refspecs.c
+++ b/tests/network/refspecs.c
@@ -146,3 +146,13 @@ void test_network_refspecs__invalid_reverse(void)
 	assert_invalid_rtransform("refs/heads/*:refs/remotes/origin/*", "master");
 	assert_invalid_rtransform("refs/heads/*:refs/remotes/origin/*", "refs/remotes/o/master");
 }
+
+void test_network_refspecs__matching(void)
+{
+	git_refspec spec;
+
+	cl_git_pass(git_refspec__parse(&spec, ":", false));
+	cl_assert_equal_s(":", spec.string);
+	cl_assert_equal_s("", spec.src);
+	cl_assert_equal_s("", spec.dst);
+}