q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=67c2a4f5f10595d4e47484d887298b87ab26a506
commit 67c2a4f5f10595d4e47484d887298b87ab26a506 Author: Daniel Kolesa <d.kol...@samsung.com> Date: Fri Sep 6 16:58:08 2019 +0200 eolian: disallow duplicate entries in requires/composite sections --- src/lib/eolian/eo_parser.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 975c2a880b..e010a3fc30 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -2157,14 +2157,28 @@ _requires_add(Eo_Lexer *ls, Eina_Strbuf *buf) { const char *required; char *fnm; + Eina_List *l; + const char *oname; + char ebuf[PATH_MAX]; eina_strbuf_reset(buf); eo_lexer_context_push(ls); parse_name(ls, buf); - required = eina_strbuf_string_get(buf); + required = eina_stringshare_add(eina_strbuf_string_get(buf)); + + EINA_LIST_FOREACH(ls->klass->requires, l, oname) + if (required == oname) + { + eo_lexer_context_restore(ls); + eina_stringshare_del(required); + snprintf(ebuf, sizeof(ebuf), "duplicate entry '%s'", oname); + eo_lexer_syntax_error(ls, ebuf); + return; + } + fnm = database_class_to_filename(required); - ls->klass->requires = eina_list_append(ls->klass->requires, eina_stringshare_add(required)); + ls->klass->requires = eina_list_append(ls->klass->requires, required); database_defer(ls->state, fnm, EINA_TRUE); eo_lexer_context_pop(ls); @@ -2174,25 +2188,39 @@ _requires_add(Eo_Lexer *ls, Eina_Strbuf *buf) static void _composite_add(Eo_Lexer *ls, Eina_Strbuf *buf) { + const char *oname; + char ebuf[PATH_MAX]; + Eina_List *l; + eina_strbuf_reset(buf); eo_lexer_context_push(ls); parse_name(ls, buf); - const char *nm = eina_strbuf_string_get(buf); + const char *nm = eina_stringshare_add(eina_strbuf_string_get(buf)); + + EINA_LIST_FOREACH(ls->klass->composite, l, oname) + if (nm == oname) + { + eo_lexer_context_restore(ls); + snprintf(ebuf, sizeof(ebuf), "duplicate entry '%s'", nm); + eina_stringshare_del(nm); + eo_lexer_syntax_error(ls, ebuf); + return; + } + char *fnm = database_class_to_filename(nm); if (!eina_hash_find(ls->state->filenames_eo, fnm)) { free(fnm); - char ebuf[PATH_MAX]; eo_lexer_context_restore(ls); snprintf(ebuf, sizeof(ebuf), "unknown interface '%s'", nm); + eina_stringshare_del(nm); eo_lexer_syntax_error(ls, ebuf); return; } /* do not introduce a dependency */ database_defer(ls->state, fnm, EINA_FALSE); free(fnm); - ls->klass->composite = eina_list_append(ls->klass->composite, - eina_stringshare_add(nm)); + ls->klass->composite = eina_list_append(ls->klass->composite, nm); eo_lexer_context_pop(ls); } --