Commit fdc637c4e266349b35ac4fb45a4e5aa63c5a78e0

Russell Belfer 2012-08-12T09:08:45

Check prettify message output buffer after cleanup This makes the message prettify buffer length check accurate.

diff --git a/src/message.c b/src/message.c
index a4aadb2..a5cc262 100644
--- a/src/message.c
+++ b/src/message.c
@@ -63,10 +63,7 @@ int git_message_prettify(char *message_out, size_t buffer_size, const char *mess
 {
 	git_buf buf = GIT_BUF_INIT;
 
-	if (strlen(message) + 1 > buffer_size) {	/* We have to account for a potentially missing \n */
-		giterr_set(GITERR_INVALID, "Buffer too short to hold the cleaned message");
-		return -1;
-	}
+	assert(message_out && buffer_size);
 
 	*message_out = '\0';
 
@@ -75,6 +72,11 @@ int git_message_prettify(char *message_out, size_t buffer_size, const char *mess
 		return -1;
 	}
 
+	if (buf.size + 1 > buffer_size) { /* +1 for NUL byte */
+		giterr_set(GITERR_INVALID, "Buffer too short to hold the cleaned message");
+		return -1;
+	}
+
 	git_buf_copy_cstr(message_out, buffer_size, &buf);
 	git_buf_free(&buf);
 
diff --git a/tests-clar/object/commit/commitstagedfile.c b/tests-clar/object/commit/commitstagedfile.c
index 628ef43..1e4affb 100644
--- a/tests-clar/object/commit/commitstagedfile.c
+++ b/tests-clar/object/commit/commitstagedfile.c
@@ -128,3 +128,63 @@ void test_object_commit_commitstagedfile__generate_predictable_object_ids(void)
 	git_tree_free(tree);
 	git_index_free(index);
 }
+
+void test_object_commit_commitstagedfile__message_prettify(void)
+{
+	char buffer[100];
+
+	cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "", 0));
+	cl_assert_equal_s(buffer, "");
+	cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "", 1));
+	cl_assert_equal_s(buffer, "");
+
+	cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "Short", 0));
+	cl_assert_equal_s(buffer, "Short\n");
+	cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "Short", 1));
+	cl_assert_equal_s(buffer, "Short\n");
+
+	cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "This is longer\nAnd multiline\n# with some comments still in\n", 0));
+	cl_assert_equal_s(buffer, "This is longer\nAnd multiline\n# with some comments still in\n");
+	cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "This is longer\nAnd multiline\n# with some comments still in\n", 1));
+	cl_assert_equal_s(buffer, "This is longer\nAnd multiline\n");
+
+	/* try out overflow */
+	cl_git_pass(git_message_prettify(buffer, sizeof(buffer),
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
+		"1234567890" "1234567890" "1234567890" "1234567890" "12345678",
+		0));
+	cl_assert_equal_s(buffer,
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
+		"1234567890" "1234567890" "1234567890" "1234567890" "12345678\n");
+
+	cl_git_pass(git_message_prettify(buffer, sizeof(buffer),
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
+		"1234567890" "1234567890" "1234567890" "1234567890" "12345678\n",
+		0));
+	cl_assert_equal_s(buffer,
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
+		"1234567890" "1234567890" "1234567890" "1234567890" "12345678\n");
+
+	cl_git_fail(git_message_prettify(buffer, sizeof(buffer),
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
+		"1234567890" "1234567890" "1234567890" "1234567890" "123456789",
+		0));
+	cl_git_fail(git_message_prettify(buffer, sizeof(buffer),
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
+		"1234567890" "1234567890" "1234567890" "1234567890" "123456789\n",
+		0));
+	cl_git_fail(git_message_prettify(buffer, sizeof(buffer),
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890",
+		0));
+	cl_git_fail(git_message_prettify(buffer, sizeof(buffer),
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890""x",
+		0));
+
+	cl_git_pass(git_message_prettify(buffer, sizeof(buffer),
+		"1234567890" "1234567890" "1234567890" "1234567890" "1234567890\n"
+		"# 1234567890" "1234567890" "1234567890" "1234567890" "1234567890\n"
+		"1234567890",
+		1));
+}