Commit fe5babacd6a2a8f358603404ee27327c20830c03

Kirill A. Shutemov 2011-06-30T00:16:23

filebuf: fix endless loop on writing buf > WRITE_BUFFER_SIZE Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>

diff --git a/src/filebuf.c b/src/filebuf.c
index ca13e61..01b36bc 100644
--- a/src/filebuf.c
+++ b/src/filebuf.c
@@ -331,6 +331,7 @@ int git_filebuf_write(git_filebuf *file, const void *buff, size_t len)
 			error = file->write(file, buf, len);
 			if (error < GIT_SUCCESS)
 				return git__rethrow(error, "Failed to write to buffer");
+			return GIT_SUCCESS;
 		}
 	}
 }
diff --git a/tests/t00-core.c b/tests/t00-core.c
index aa00085..31ed8c3 100644
--- a/tests/t00-core.c
+++ b/tests/t00-core.c
@@ -692,6 +692,19 @@ BEGIN_TEST(filebuf1, "make sure GIT_FILEBUF_APPEND works as expected")
 	must_pass(gitfo_unlink(test));
 END_TEST
 
+BEGIN_TEST(filebuf2, "make sure git_filebuf_write writes large buffer correctly")
+	git_filebuf file;
+	char test[] = "test";
+	unsigned char buf[4096 * 4]; /* 2 * WRITE_BUFFER_SIZE */
+
+	memset(buf, 0xfe, sizeof(buf));
+	must_pass(git_filebuf_open(&file, test, 0));
+	must_pass(git_filebuf_write(&file, buf, sizeof(buf)));
+	must_pass(git_filebuf_commit(&file));
+
+	must_pass(gitfo_unlink(test));
+END_TEST
+
 BEGIN_SUITE(core)
 	ADD_TEST(string0);
 	ADD_TEST(string1);
@@ -716,4 +729,5 @@ BEGIN_SUITE(core)
 
 	ADD_TEST(filebuf0);
 	ADD_TEST(filebuf1);
+	ADD_TEST(filebuf2);
 END_SUITE