[PATCH 1/4] convert: Safer handling of $Id$ contraction.
From: Henrik Grubbström (Grubba) <hidden>
Date: 2016-06-15 22:48:26
Subsystem:
the rest · Maintainer:
Linus Torvalds
The code to contract $Id:xxxxx$ strings could eat an arbitrary amount of source text if the terminating $ was lost. It now refuses to contract $Id:xxxxx$ strings spanning multiple lines. Signed-off-by: Henrik Grubbström <redacted> --- The behaviour implemented by the patch is in line with what other VCSes that implement $Id$ do. convert.c | 17 +++++++++++++++-- t/t0021-conversion.sh | 16 ++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/convert.c b/convert.c
index 4f8fcb7..91207ab 100644
--- a/convert.c
+++ b/convert.c@@ -425,6 +425,7 @@ static int count_ident(const char *cp, unsigned long size) cnt++; break; } + if (ch == '\n') break; } } return cnt;
@@ -433,7 +434,7 @@ static int count_ident(const char *cp, unsigned long size) static int ident_to_git(const char *path, const char *src, size_t len, struct strbuf *buf, int ident) { - char *dst, *dollar; + char *dst, *dollar, *nl; if (!ident || !count_ident(src, len)) return 0;
@@ -455,6 +456,12 @@ static int ident_to_git(const char *path, const char *src, size_t len, dollar = memchr(src + 3, '$', len - 3); if (!dollar) break; + nl = memchr(src + 3, '\n', len - 3); + if (nl && nl < dollar) { + /* Line break before the next dollar. */ + continue; + } + memcpy(dst, "Id$", 3); dst += 3; len -= dollar + 1 - src;
@@ -470,7 +477,7 @@ static int ident_to_worktree(const char *path, const char *src, size_t len, struct strbuf *buf, int ident) { unsigned char sha1[20]; - char *to_free = NULL, *dollar; + char *to_free = NULL, *dollar, *nl; int cnt; if (!ident)
@@ -514,6 +521,12 @@ static int ident_to_worktree(const char *path, const char *src, size_t len, break; } + nl = memchr(src + 3, '\n', len - 3); + if (nl && nl < dollar) { + /* Line break before the next dollar. */ + continue; + } + len -= dollar + 1 - src; src = dollar + 1; } else {
diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh
index 6cb8d60..a21a8d2 100755
--- a/t/t0021-conversion.sh
+++ b/t/t0021-conversion.sh@@ -65,17 +65,21 @@ test_expect_success expanded_in_repo ' echo "\$Id:NoSpaceAtFront \$" echo "\$Id:NoSpaceAtEitherEnd\$" echo "\$Id: NoTerminatingSymbol" + echo "\$Id: Foreign Commit With Spaces $" + echo "\$Id: NoTerminatingSymbolAtEOF" } > expanded-keywords && { echo "File with expanded keywords" - echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$" - echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$" - echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$" - echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$" - echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$" - echo "\$Id: 4f21723e7b15065df7de95bd46c8ba6fb1818f4c \$" + echo "\$Id: fd0478f5f1486f3d5177d4c3f6eb2765e8fc56b9 \$" + echo "\$Id: fd0478f5f1486f3d5177d4c3f6eb2765e8fc56b9 \$" + echo "\$Id: fd0478f5f1486f3d5177d4c3f6eb2765e8fc56b9 \$" + echo "\$Id: fd0478f5f1486f3d5177d4c3f6eb2765e8fc56b9 \$" + echo "\$Id: fd0478f5f1486f3d5177d4c3f6eb2765e8fc56b9 \$" + echo "\$Id: fd0478f5f1486f3d5177d4c3f6eb2765e8fc56b9 \$" echo "\$Id: NoTerminatingSymbol" + echo "\$Id: fd0478f5f1486f3d5177d4c3f6eb2765e8fc56b9 $" + echo "\$Id: NoTerminatingSymbolAtEOF" } > expected-output && git add expanded-keywords &&
--
1.6.4.122.g6ffd7