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);
 }
 

-- 


Reply via email to