Jonathan Tan <jonathantanmy@xxxxxxxxxx> 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. > (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@xxxxxxxxxx> > --- > 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; > } > > /*