diff options
author | Jonathan Tan <jonathantanmy@google.com> | 2016-11-02 10:29:16 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-11-29 14:22:08 -0800 |
commit | e4319562bc2834096fade432fd90c985b96476db (patch) | |
tree | 77709e8ee4d037edf8e14138f6d2984d441c2b2d /trailer.c | |
parent | be5a750939c212bc0781ffa04fabcfd2b2bd744e (diff) | |
download | git-e4319562bc2834096fade432fd90c985b96476db.tar.gz |
trailer: be stricter in parsing separators
Currently, a line is interpreted to be a trailer line if it contains a
separator. Make parsing stricter by requiring the text on the left of
the separator, if not the empty string, to be of the "<token><optional
whitespace>" form.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'trailer.c')
-rw-r--r-- | trailer.c | 29 |
1 files changed, 23 insertions, 6 deletions
@@ -563,15 +563,32 @@ static int token_matches_item(const char *tok, struct arg_item *item, int tok_le } /* - * Return the location of the first separator in line, or -1 if there is no - * separator. + * If the given line is of the form + * "<token><optional whitespace><separator>..." or "<separator>...", return the + * location of the separator. Otherwise, return -1. The optional whitespace + * is allowed there primarily to allow things like "Bug #43" where <token> is + * "Bug" and <separator> is "#". + * + * The separator-starts-line case (in which this function returns 0) is + * distinguished from the non-well-formed-line case (in which this function + * returns -1) because some callers of this function need such a distinction. */ static int find_separator(const char *line, const char *separators) { - int loc = strcspn(line, separators); - if (!line[loc]) - return -1; - return loc; + int whitespace_found = 0; + const char *c; + for (c = line; *c; c++) { + if (strchr(separators, *c)) + return c - line; + if (!whitespace_found && (isalnum(*c) || *c == '-')) + continue; + if (c != line && (*c == ' ' || *c == '\t')) { + whitespace_found = 1; + continue; + } + break; + } + return -1; } /* |