Commit 5f74c476939894c4512262ec11188a44bfe4f50a

Vicent Marti 2014-04-07T20:51:39

Merge pull request #2255 from libgit2/rb/fix-multiple-nfd-iconv-bug Fix bug with multiple iconv conversions in one dir

diff --git a/src/path.c b/src/path.c
index 1dccf90..7cad28d 100644
--- a/src/path.c
+++ b/src/path.c
@@ -782,6 +782,8 @@ int git_path_iconv(git_path_iconv_t *ic, char **in, size_t *inlen)
 		!git_path_has_non_ascii(*in, *inlen))
 		return 0;
 
+	git_buf_clear(&ic->buf);
+
 	while (1) {
 		if (git_buf_grow(&ic->buf, wantlen + 1) < 0)
 			return -1;
diff --git a/tests/core/iconv.c b/tests/core/iconv.c
index 8aedab2..cb85f45 100644
--- a/tests/core/iconv.c
+++ b/tests/core/iconv.c
@@ -39,8 +39,9 @@ void test_core_iconv__decomposed_to_precomposed(void)
 {
 #ifdef GIT_USE_ICONV
 	char *data = nfd;
-	size_t datalen = strlen(nfd);
+	size_t datalen, nfdlen = strlen(nfd);
 
+	datalen = nfdlen;
 	cl_git_pass(git_path_iconv(&ic, &data, &datalen));
 	GIT_UNUSED(datalen);
 
@@ -48,6 +49,15 @@ void test_core_iconv__decomposed_to_precomposed(void)
 	 * (on platforms where iconv is enabled, of course).
 	 */
 	cl_assert_equal_s(nfc, data);
+
+	/* should be able to do it multiple times with the same git_path_iconv_t */
+	data = nfd; datalen = nfdlen;
+	cl_git_pass(git_path_iconv(&ic, &data, &datalen));
+	cl_assert_equal_s(nfc, data);
+
+	data = nfd; datalen = nfdlen;
+	cl_git_pass(git_path_iconv(&ic, &data, &datalen));
+	cl_assert_equal_s(nfc, data);
 #endif
 }