From bf2c0c340526375217796df18a52f4c08e2344d4 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Mon, 7 Mar 2016 15:01:13 +0000 Subject: [PATCH] eolian: validate eo/legacy prefix to be [a-z_][a-z0-9_]* --- src/lib/eolian/eo_parser.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index a0d9ddd814..c16019e8fe 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -1642,6 +1642,30 @@ parse_events(Eo_Lexer *ls) check_match(ls, '}', '{', line, col); } +static void +_validate_pfx(Eo_Lexer *ls) +{ + char ebuf[PATH_MAX]; + check(ls, TOK_VALUE); + const char *str = ls->t.value.s; + if ((*str != '_') && ((*str < 'a') || (*str > 'z'))) + goto error; + for (++str; *str; ++str) + { + if (*str == '_') + continue; + if ((*str >= 'a') && (*str <= 'z')) + continue; + if ((*str >= '0') && (*str <= '9')) + continue; + goto error; + } + return; +error: + snprintf(ebuf, sizeof(ebuf), "invalid prefix '%s'", ls->t.value.s); + eo_lexer_syntax_error(ls, ebuf); +} + static void parse_class_body(Eo_Lexer *ls, Eolian_Class_Type type) { @@ -1663,7 +1687,7 @@ parse_class_body(Eo_Lexer *ls, Eolian_Class_Type type) CASE_LOCK(ls, legacy_prefix, "legacy prefix definition") eo_lexer_get(ls); check_next(ls, ':'); - check(ls, TOK_VALUE); + _validate_pfx(ls); ls->tmp.kls->legacy_prefix = eina_stringshare_ref(ls->t.value.s); eo_lexer_get(ls); check_next(ls, ';'); @@ -1672,7 +1696,7 @@ parse_class_body(Eo_Lexer *ls, Eolian_Class_Type type) CASE_LOCK(ls, eo_prefix, "eo prefix definition") eo_lexer_get(ls); check_next(ls, ':'); - check(ls, TOK_VALUE); + _validate_pfx(ls); ls->tmp.kls->eo_prefix = eina_stringshare_ref(ls->t.value.s); eo_lexer_get(ls); check_next(ls, ';');