From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: pclouds@gmail.com
Cc: git@vger.kernel.org, hi-angel@yandex.ru, peff@peff.net,
ramsay@ramsayjones.plus.com, sunshine@sunshineco.com,
Junio C Hamano <gitster@pobox.com>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>
Subject: [PATCH v4 1/2] refs.c: refactor check_refname_component()
Date: Tue, 5 Mar 2019 19:08:33 +0700 [thread overview]
Message-ID: <20190305120834.7284-2-pclouds@gmail.com> (raw)
In-Reply-To: <20190305120834.7284-1-pclouds@gmail.com>
The core logic of this function is factored out to provide more
information when the refname is invalid: what part that is and exact
what is wrong with it. This will be useful for a coming function that
has to turn a string into a valid refname component.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
refs.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 62 insertions(+), 16 deletions(-)
diff --git a/refs.c b/refs.c
index 142888a40a..70c55ea1b6 100644
--- a/refs.c
+++ b/refs.c
@@ -57,10 +57,21 @@ static unsigned char refname_disposition[256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
};
+enum refname_check_code {
+ refname_ok = 0,
+ refname_contains_dotdot,
+ refname_contains_atopen,
+ refname_has_badchar,
+ refname_contains_wildcard,
+ refname_starts_with_dot,
+ refname_ends_with_dotlock,
+ refname_component_has_zero_length
+};
+
/*
* Try to read one refname component from the front of refname.
- * Return the length of the component found, or -1 if the component is
- * not legal. It is legal if it is something reasonable to have under
+ * If the component is legal, return the end of the component in cp_out.
+ * It is legal if it is something reasonable to have under
* ".git/refs/"; We do not like it if:
*
* - any path component of it begins with ".", or
@@ -71,11 +82,15 @@ static unsigned char refname_disposition[256] = {
* - it ends with a "/", or
* - it ends with ".lock", or
* - it contains a "@{" portion
+ *
+ * in which case cp_out points to the beginning of the illegal part.
*/
-static int check_refname_component(const char *refname, int *flags)
+static enum refname_check_code do_check_refname_component(
+ const char *refname, int *flags, const char **cp_out)
{
const char *cp;
char last = '\0';
+ enum refname_check_code ret = refname_ok;
for (cp = refname; ; cp++) {
int ch = *cp & 255;
@@ -84,18 +99,28 @@ static int check_refname_component(const char *refname, int *flags)
case 1:
goto out;
case 2:
- if (last == '.')
- return -1; /* Refname contains "..". */
+ if (last == '.') {
+ cp--;
+ ret = refname_contains_dotdot;
+ goto done;
+ }
break;
case 3:
- if (last == '@')
- return -1; /* Refname contains "@{". */
+ if (last == '@') {
+ cp--;
+ ret = refname_contains_atopen; /* @{ */
+ goto done;
+ }
break;
case 4:
- return -1;
+ ret = refname_has_badchar;
+ goto done;
case 5:
- if (!(*flags & REFNAME_REFSPEC_PATTERN))
- return -1; /* refspec can't be a pattern */
+ if (!(*flags & REFNAME_REFSPEC_PATTERN)) {
+ /* refspec can't be a pattern */
+ ret = refname_contains_wildcard;
+ goto done;
+ }
/*
* Unset the pattern flag so that we only accept
@@ -107,13 +132,34 @@ static int check_refname_component(const char *refname, int *flags)
last = ch;
}
out:
- if (cp == refname)
- return 0; /* Component has zero length. */
- if (refname[0] == '.')
- return -1; /* Component starts with '.'. */
+ if (cp == refname) {
+ ret = refname_component_has_zero_length;
+ goto done;
+ }
+ if (refname[0] == '.') {
+ cp = refname;
+ ret = refname_starts_with_dot;
+ goto done;
+ }
if (cp - refname >= LOCK_SUFFIX_LEN &&
- !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
- return -1; /* Refname ends with ".lock". */
+ !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN)) {
+ cp -= LOCK_SUFFIX_LEN;
+ ret = refname_ends_with_dotlock;
+ }
+done:
+ *cp_out = cp;
+ return ret;
+}
+
+/* Return the length of the component if it's legal otherwise -1 */
+static int check_refname_component(const char *refname, int *flags)
+{
+ const char *cp;
+ enum refname_check_code ret;
+
+ ret = do_check_refname_component(refname, flags, &cp);
+ if (ret)
+ return -1;
return cp - refname;
}
--
2.21.0.rc1.337.gdf7f8d0522
next prev parent reply other threads:[~2019-03-05 12:08 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-18 14:36 git gc fails with "unable to resolve reference" for worktree hi-angel
2019-02-18 15:02 ` Duy Nguyen
2019-02-18 15:09 ` hi-angel
2019-02-18 15:18 ` Duy Nguyen
2019-02-20 14:34 ` hi-angel
2019-02-21 11:00 ` [PATCH] worktree add: sanitize worktree names Nguyễn Thái Ngọc Duy
2019-02-21 11:28 ` Konstantin Kharlamov
2019-02-21 11:38 ` Duy Nguyen
2019-02-21 11:44 ` Konstantin Kharlamov
2019-02-21 11:52 ` Duy Nguyen
2019-02-21 13:23 ` Jeff King
2019-02-21 12:19 ` [PATCH v2 0/1] " Nguyễn Thái Ngọc Duy
2019-02-21 12:19 ` [PATCH v2 1/1] " Nguyễn Thái Ngọc Duy
2019-02-21 13:22 ` Jeff King
2019-02-21 17:41 ` Ramsay Jones
2019-02-22 9:21 ` Duy Nguyen
2019-02-26 10:58 ` [PATCH v3 0/1] " Nguyễn Thái Ngọc Duy
2019-02-26 10:58 ` [PATCH v3 1/1] " Nguyễn Thái Ngọc Duy
2019-02-27 12:08 ` Jeff King
2019-02-27 14:23 ` Eric Sunshine
2019-02-27 16:04 ` Jeff King
2019-03-03 1:22 ` Junio C Hamano
2019-03-04 11:19 ` Duy Nguyen
2019-03-04 12:04 ` Duy Nguyen
2019-03-04 15:06 ` Johannes Schindelin
2019-03-05 12:08 ` [PATCH v4 0/2] " Nguyễn Thái Ngọc Duy
2019-03-05 12:08 ` Nguyễn Thái Ngọc Duy [this message]
2019-03-06 21:49 ` [PATCH v4 1/2] refs.c: refactor check_refname_component() Jeff King
2019-03-07 23:24 ` Eric Sunshine
2019-03-05 12:08 ` [PATCH v4 2/2] worktree add: sanitize worktree names Nguyễn Thái Ngọc Duy
2019-03-08 9:28 ` [PATCH v5 0/1] " Nguyễn Thái Ngọc Duy
2019-03-08 9:28 ` [PATCH v5 1/1] " Nguyễn Thái Ngọc Duy
2019-03-10 2:02 ` Eric Sunshine
2019-03-11 6:20 ` Junio C Hamano
2019-03-11 9:24 ` Duy Nguyen
2019-03-11 22:39 ` Jeff King
2019-03-12 6:32 ` Junio C Hamano
2019-03-11 6:36 ` Junio C Hamano
2019-03-11 9:27 ` Duy Nguyen
2019-03-11 13:05 ` Johannes Schindelin
2019-03-12 6:45 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190305120834.7284-2-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=hi-angel@yandex.ru \
--cc=peff@peff.net \
--cc=ramsay@ramsayjones.plus.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.