diff --git a/src/message.c b/src/message.c index a4aadb28f..a5cc26237 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 628ef43c2..1e4affb8c 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)); +}