diff options
-rw-r--r-- | attr.c | 5 | ||||
-rw-r--r-- | attr.h | 6 | ||||
-rwxr-xr-x | t/t0003-attributes.sh | 25 |
3 files changed, 34 insertions, 2 deletions
@@ -344,6 +344,11 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, return NULL; name = cp; + if (strlen(line) >= ATTR_MAX_LINE_LENGTH) { + warning(_("ignoring overly long attributes line %d"), lineno); + return NULL; + } + if (*cp == '"' && !unquote_c_style(&pattern, name, &states)) { name = pattern.buf; namelen = pattern.len; @@ -107,6 +107,12 @@ * - Free the `attr_check` struct by calling `attr_check_free()`. */ +/** + * The maximum line length for a gitattributes file. If the line exceeds this + * length we will ignore it. + */ +#define ATTR_MAX_LINE_LENGTH 2048 + struct index_state; /** diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index 416386ce2f..7d68e6a56e 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -339,6 +339,15 @@ test_expect_success 'query binary macro directly' ' test_cmp expect actual ' +test_expect_success 'large attributes line ignored in tree' ' + test_when_finished "rm .gitattributes" && + printf "path %02043d" 1 >.gitattributes && + git check-attr --all path >actual 2>err && + echo "warning: ignoring overly long attributes line 1" >expect && + test_cmp expect err && + test_must_be_empty actual +' + test_expect_success 'large attributes line ignores trailing content in tree' ' test_when_finished "rm .gitattributes" && # older versions of Git broke lines at 2048 bytes; the 2045 bytes @@ -347,7 +356,18 @@ test_expect_success 'large attributes line ignores trailing content in tree' ' # erroneously parsed. printf "a %02045dtrailing attribute\n" 1 >.gitattributes && git check-attr --all trailing >actual 2>err && - test_must_be_empty err && + echo "warning: ignoring overly long attributes line 1" >expect && + test_cmp expect err && + test_must_be_empty actual +' + +test_expect_success 'large attributes line ignored in index' ' + test_when_finished "git update-index --remove .gitattributes" && + blob=$(printf "path %02043d" 1 | git hash-object -w --stdin) && + git update-index --add --cacheinfo 100644,$blob,.gitattributes && + git check-attr --cached --all path >actual 2>err && + echo "warning: ignoring overly long attributes line 1" >expect && + test_cmp expect err && test_must_be_empty actual ' @@ -356,7 +376,8 @@ test_expect_success 'large attributes line ignores trailing content in index' ' blob=$(printf "a %02045dtrailing attribute\n" 1 | git hash-object -w --stdin) && git update-index --add --cacheinfo 100644,$blob,.gitattributes && git check-attr --cached --all trailing >actual 2>err && - test_must_be_empty err && + echo "warning: ignoring overly long attributes line 1" >expect && + test_cmp expect err && test_must_be_empty actual ' |