Allowing any refname component to end with ".lock" is looking for trouble; for example, $ git br foo.lock/bar $ git br foo fatal: Unable to create '[...]/.git/refs/heads/foo.lock': File exists. Therefore, do not allow any refname component to end with ".lock". Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> --- Documentation/git-check-ref-format.txt | 4 +--- refs.c | 6 +++--- t/t1402-check-ref-format.sh | 4 ++++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt index 3ab22b9..f2d21c7 100644 --- a/Documentation/git-check-ref-format.txt +++ b/Documentation/git-check-ref-format.txt @@ -28,7 +28,7 @@ git imposes the following rules on how references are named: . They can include slash `/` for hierarchical (directory) grouping, but no slash-separated component can begin with a - dot `.`. + dot `.` or end with the sequence `.lock`. . They must contain at least one `/`. This enforces the presence of a category like `heads/`, `tags/` etc. but the actual names are not @@ -47,8 +47,6 @@ git imposes the following rules on how references are named: . They cannot end with a slash `/` nor a dot `.`. -. They cannot end with the sequence `.lock`. - . They cannot contain a sequence `@{`. . They cannot contain a `\`. diff --git a/refs.c b/refs.c index 372350e..6985a3f 100644 --- a/refs.c +++ b/refs.c @@ -933,14 +933,14 @@ int normalize_refname(char *dst, int dstlen, const char *ref, int flags) if (component[0] == '.') /* Components must not start with '.'. */ return -1; + if (component_len >= 5 && !memcmp(&component[component_len - 5], ".lock", 5)) + /* Components must not end with ".lock". */ + return -1; } while (ch != 0); if (last == '.') /* Refname must not end with '.'. */ return -1; - if (component_len >= 5 && !memcmp(&component[component_len - 5], ".lock", 5)) - /* Refname must not end with ".lock". */ - return -1; if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2) /* Refname must have at least two components. */ return -1; diff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh index b0b773b..419788f 100755 --- a/t/t1402-check-ref-format.sh +++ b/t/t1402-check-ref-format.sh @@ -43,6 +43,8 @@ invalid_ref 'heads/foo?bar' valid_ref 'foo./bar' invalid_ref 'heads/foo.lock' invalid_ref 'heads///foo.lock' +invalid_ref 'foo.lock/bar' +invalid_ref 'foo.lock///bar' valid_ref 'heads/foo@bar' invalid_ref 'heads/v@{ation' invalid_ref 'heads/foo\bar' @@ -158,5 +160,7 @@ invalid_ref_normalized 'heads/./foo' invalid_ref_normalized 'heads\foo' invalid_ref_normalized 'heads/foo.lock' invalid_ref_normalized 'heads///foo.lock' +invalid_ref_normalized 'foo.lock/bar' +invalid_ref_normalized 'foo.lock///bar' test_done -- 1.7.6.8.gd2879 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html