From 04f788023fd04e60a12c2a19787857c72b3817f4 Mon Sep 17 00:00:00 2001 From: Brodie Rao Date: Tue, 9 Aug 2011 20:49:12 -0700 Subject: [PATCH] commit: properly parse empty commit messages This ensures commit->message is always non-NULL, even if the commit message is empty or consists of only a newline. One such commit can be found in the wild in the jQuery repository: https://github.com/jquery/jquery/commit/25b424134f9927a5bf0bab5cba836a0aa6c3cfc1 --- src/commit.c | 4 ++-- .../36/97d64be941a53d4ae8f6a271e4e3fa56b022cc | Bin 0 -> 23 bytes .../94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 | Bin 0 -> 119 bytes .../a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 | Bin 0 -> 150 bytes tests/resources/testrepo.git/refs/heads/master | Bin 41 -> 41 bytes tests/t04-commit.c | 2 ++ tests/t10-refs.c | 2 +- 7 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 tests/resources/testrepo.git/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc create mode 100644 tests/resources/testrepo.git/objects/94/4c0f6e4dfa41595e6eb3ceecdb14f50fe18162 create mode 100644 tests/resources/testrepo.git/objects/a6/5fedf39aefe402d3bb6e24df4d4f5fe4547750 diff --git a/src/commit.c b/src/commit.c index 0ee3854c4..ced457ecc 100644 --- a/src/commit.c +++ b/src/commit.c @@ -221,10 +221,10 @@ int git_commit__parse_buffer(git_commit *commit, const void *data, size_t len) } /* parse commit message */ - while (buffer < buffer_end && *buffer == '\n') + while (buffer < buffer_end - 1 && *buffer == '\n') buffer++; - if (buffer < buffer_end) { + if (buffer <= buffer_end) { commit->message = git__strndup(buffer, buffer_end - buffer); if (!commit->message) return GIT_ENOMEM; diff --git a/tests/resources/testrepo.git/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc b/tests/resources/testrepo.git/objects/36/97d64be941a53d4ae8f6a271e4e3fa56b022cc new file mode 100644 index 0000000000000000000000000000000000000000..9bb5b623bdbc11a70db482867b5b26d0d7b3215c GIT binary patch literal 23 fcmb7G-5C`FfcPQQ3!H%bn$g%SfOmF@NI2De~WFK%%kl}eMcVO zI|fyeRFs&PoDrXvnUktlQc=QSHvO9SOUI?QUN62aDtz+zSJ(!nGf<^@spViL%SGD` Z-hZ)NCTD++(0m7PL-bAdvgQ4=D9j?f9l*|80Bjm_@g(h>T5Jb3V=xAqv| z9qz`e3Ykc3jY?Bxav=weT2NGFDvoNfRo&4=Z(h9WGN34ih^$ys4#gM3fJH=+gHJqJ zrkZLbGW;2HU*RTw47koLeSyp9!Onu(!!tv)S!%=s&G7U;E`l EFjbjGl>h($ literal 0 HcmV?d00001 diff --git a/tests/resources/testrepo.git/refs/heads/master b/tests/resources/testrepo.git/refs/heads/master index 9536ad89cfb3b156e2ad6bafe06c6a708d7d2b73..3d8f0a402b492c248b12ac72b6a66eebe941023f 100644 GIT binary patch literal 41 vcmYc^GfhiPNi()gOifEQF)&IoPD(OMH8M#_Gf6Q?1In40nwXoL8gKys2{Q}F literal 41 ucmV~$!4Uu;2m`Rc(|EMVIZi>?e*}|k_<email, "schacon@gmail.com") == 0); must_be_true(strcmp(committer->name, "Scott Chacon") == 0); must_be_true(strcmp(committer->email, "schacon@gmail.com") == 0); + must_be_true(message != NULL); must_be_true(strchr(message, '\n') != NULL); must_be_true(commit_time > 0); must_be_true(parents <= 2); diff --git a/tests/t10-refs.c b/tests/t10-refs.c index 67034155d..1b3e0a3aa 100644 --- a/tests/t10-refs.c +++ b/tests/t10-refs.c @@ -70,7 +70,7 @@ END_TEST static const char *head_tracker_sym_ref_name = "head-tracker"; static const char *current_head_target = "refs/heads/master"; -static const char *current_master_tip = "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"; +static const char *current_master_tip = "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"; BEGIN_TEST(readsym0, "lookup a symbolic reference") git_repository *repo;