[PATCH] tag: refuse tag messages that contain NULs
From: Nguyễn Thái Ngọc Duy <hidden>
Date: 2016-06-15 22:53:06
Subsystem:
the rest · Maintainer:
Linus Torvalds
This follows the paranoid spirit in 37576c1 (commit_tree(): refuse commit messages that contain NULs - 2011-12-15) and stops users from creating tags that contain NULs. If these tags are merged into a commit as mergetag lines, they may break the commit header processing badly. While at it, check for NULs in mergetag and gpgsig lines before committing too. Signed-off-by: Nguyễn Thái Ngọc Duy <redacted> --- builtin/mktag.c | 3 +++ builtin/tag.c | 2 ++ commit.c | 2 ++ t/t7004-tag.sh | 4 ++++ 4 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/builtin/mktag.c b/builtin/mktag.c
index 640ab64..f51ce20 100644
--- a/builtin/mktag.c
+++ b/builtin/mktag.c@@ -165,6 +165,9 @@ int cmd_mktag(int argc, const char **argv, const char *prefix) if (verify_tag(buf.buf, buf.len) < 0) die("invalid tag signature file"); + if (memchr(buf.buf, '\0', buf.len)) + die("a NUL byte in tag message not allowed."); + if (write_sha1_file(buf.buf, buf.len, tag_type, result_sha1) < 0) die("unable to write tag file");
diff --git a/builtin/tag.c b/builtin/tag.c
index 31f02e8..e66811e 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c@@ -259,6 +259,8 @@ static int build_tag_object(struct strbuf *buf, int sign, unsigned char *result) { if (sign && do_sign(buf) < 0) return error(_("unable to sign the tag")); + if (memchr(buf->buf, '\0', buf->len)) + return error("a NUL byte in tag message not allowed."); if (write_sha1_file(buf->buf, buf->len, tag_type, result) < 0) return error(_("unable to write tag file")); return 0;
diff --git a/commit.c b/commit.c
index 4b39c19..545325f 100644
--- a/commit.c
+++ b/commit.c@@ -1144,6 +1144,8 @@ int commit_tree_extended(const struct strbuf *msg, unsigned char *tree, strbuf_addf(&buffer, "encoding %s\n", git_commit_encoding); while (extra) { + if (memchr(extra->value, '\0', extra->len)) + return error("a NUL byte in commit header %s not allowed.", extra->key); add_extra_header(&buffer, extra); extra = extra->next; }
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index e93ac73..8cb13e5 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh@@ -1269,4 +1269,8 @@ test_expect_success 'mixing incompatibles modes and options is forbidden' ' test_must_fail git tag -v -s ' +test_expect_success 'tag content contains NUL' ' + test_must_fail git tag -F "$TEST_DIRECTORY"/t3900/UTF-16.txt utf16 +' + test_done
--
1.7.8.36.g69ee2