summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@osg.samsung.com>2017-12-19 00:20:40 +0100
committerDaniel Kolesa <d.kolesa@osg.samsung.com>2017-12-19 00:20:40 +0100
commit03e77ea3611144b1f3cfebcf84580afd4ba65d89 (patch)
treed9b4f214d560661dcca45329e60b2b9195b5e34a
parenta2309c5083a643011b4e69347d6be4da3a0adee8 (diff)
downloadefl-03e77ea3611144b1f3cfebcf84580afd4ba65d89.tar.gz
eolian: fix use-after-free in eo_parser
Thanks @netstar for finding this. Fixes T6523.
-rw-r--r--src/lib/eolian/eo_parser.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index b8e721a11b..882a8bef2c 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -2499,6 +2499,7 @@ end:
Eolian_Unit *
eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool eot, Eolian_Class **fcl)
{
+ Eolian_Unit *ret = NULL;
Eolian_Class *cl = eina_hash_find(parent->state->parsed, filename);
if (cl)
{
@@ -2510,7 +2511,7 @@ eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool eot
fname = eina_stringshare_add((fsl > bsl) ? (fsl + 1) : (bsl + 1));
if (fname)
{
- Eolian_Unit *ret = eina_hash_find(parent->state->units, fname);
+ ret = eina_hash_find(parent->state->units, fname);
eina_stringshare_del(fname);
return ret;
}
@@ -2555,12 +2556,13 @@ eo_parser_database_fill(Eolian_Unit *parent, const char *filename, Eina_Bool eot
if (fcl) *fcl = cl;
done:
+ ret = ls->unit;
eina_hash_set(ls->state->parsed, filename, eot ? (void *)EINA_TRUE : cl);
eina_hash_set(ls->state->parsing, filename, (void *)EINA_FALSE);
- eina_hash_add(parent->children, filename, ls->unit);
+ eina_hash_add(parent->children, filename, ret);
eo_lexer_free(ls);
- return ls->unit;
+ return ret;
error:
eina_hash_set(ls->state->parsing, filename, (void *)EINA_FALSE);