attr: change validity check for attribute names to use positive logic
Convert 'invalid_attr_name()' to 'attr_name_valid()' and use positive logic for the return value. In addition create a helper function that prints out an error message when an invalid attribute name is used. We could later update the message to exactly spell out what the rules for a good attribute name are, etc. Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
34
attr.c
34
attr.c
@ -74,23 +74,33 @@ static unsigned hash_name(const char *name, int namelen)
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int invalid_attr_name(const char *name, int namelen)
|
static int attr_name_valid(const char *name, size_t namelen)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Attribute name cannot begin with '-' and must consist of
|
* Attribute name cannot begin with '-' and must consist of
|
||||||
* characters from [-A-Za-z0-9_.].
|
* characters from [-A-Za-z0-9_.].
|
||||||
*/
|
*/
|
||||||
if (namelen <= 0 || *name == '-')
|
if (namelen <= 0 || *name == '-')
|
||||||
return -1;
|
return 0;
|
||||||
while (namelen--) {
|
while (namelen--) {
|
||||||
char ch = *name++;
|
char ch = *name++;
|
||||||
if (! (ch == '-' || ch == '.' || ch == '_' ||
|
if (! (ch == '-' || ch == '.' || ch == '_' ||
|
||||||
('0' <= ch && ch <= '9') ||
|
('0' <= ch && ch <= '9') ||
|
||||||
('a' <= ch && ch <= 'z') ||
|
('a' <= ch && ch <= 'z') ||
|
||||||
('A' <= ch && ch <= 'Z')) )
|
('A' <= ch && ch <= 'Z')) )
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void report_invalid_attr(const char *name, size_t len,
|
||||||
|
const char *src, int lineno)
|
||||||
|
{
|
||||||
|
struct strbuf err = STRBUF_INIT;
|
||||||
|
strbuf_addf(&err, _("%.*s is not a valid attribute name"),
|
||||||
|
(int) len, name);
|
||||||
|
fprintf(stderr, "%s: %s:%d\n", err.buf, src, lineno);
|
||||||
|
strbuf_release(&err);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct git_attr *git_attr_internal(const char *name, int len)
|
static struct git_attr *git_attr_internal(const char *name, int len)
|
||||||
@ -105,7 +115,7 @@ static struct git_attr *git_attr_internal(const char *name, int len)
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (invalid_attr_name(name, len))
|
if (!attr_name_valid(name, len))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
FLEX_ALLOC_MEM(a, name, name, len);
|
FLEX_ALLOC_MEM(a, name, name, len);
|
||||||
@ -196,17 +206,15 @@ static const char *parse_attr(const char *src, int lineno, const char *cp,
|
|||||||
cp++;
|
cp++;
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
if (invalid_attr_name(cp, len)) {
|
if (!attr_name_valid(cp, len)) {
|
||||||
fprintf(stderr,
|
report_invalid_attr(cp, len, src, lineno);
|
||||||
"%.*s is not a valid attribute name: %s:%d\n",
|
|
||||||
len, cp, src, lineno);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* As this function is always called twice, once with
|
* As this function is always called twice, once with
|
||||||
* e == NULL in the first pass and then e != NULL in
|
* e == NULL in the first pass and then e != NULL in
|
||||||
* the second pass, no need for invalid_attr_name()
|
* the second pass, no need for attr_name_valid()
|
||||||
* check here.
|
* check here.
|
||||||
*/
|
*/
|
||||||
if (*cp == '-' || *cp == '!') {
|
if (*cp == '-' || *cp == '!') {
|
||||||
@ -258,10 +266,8 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
|
|||||||
name += strlen(ATTRIBUTE_MACRO_PREFIX);
|
name += strlen(ATTRIBUTE_MACRO_PREFIX);
|
||||||
name += strspn(name, blank);
|
name += strspn(name, blank);
|
||||||
namelen = strcspn(name, blank);
|
namelen = strcspn(name, blank);
|
||||||
if (invalid_attr_name(name, namelen)) {
|
if (!attr_name_valid(name, namelen)) {
|
||||||
fprintf(stderr,
|
report_invalid_attr(name, namelen, src, lineno);
|
||||||
"%.*s is not a valid attribute name: %s:%d\n",
|
|
||||||
namelen, name, src, lineno);
|
|
||||||
goto fail_return;
|
goto fail_return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user