Re: [PATCH v2 1/5] trailer: be stricter in parsing separators
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Nov 1, 2016, 20:32 UTC
- Message-ID
- <xmqqvaw7ndow.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <c7db0aafb543845382e1835e3704273d3596e6bb.1478028700.git.jonathantanmy@google.com>
Jonathan Tan <jonathantanmy@google.com> writes:
> 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.
Hmph. The optional whitespace is to allow for what kind of line?
It is not for "Signed off by:" that is a misspelt "Signed-off-by:"; it may not hurt but I do not think of a case that would be useful offhand.
Show 46 quoted lines
> (The find_separator function distinguishes the no-separator case from
> the separator-starts-line case because some callers of this function
> need such a distinction.)
>
> Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
> ---
> trailer.c | 23 +++++++++++++++++------
> 1 file changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/trailer.c b/trailer.c
> index f0ecde2..0ee634f 100644
> --- a/trailer.c
> +++ b/trailer.c
> @@ -563,15 +563,26 @@ 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.
> */
> 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;
> }
>
> /*