eo: Fix crash in case of API misuse
authorJean-Philippe Andre <jp.andre@samsung.com>
Mon, 17 Apr 2017 10:39:42 +0000 (19:39 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Tue, 18 Apr 2017 06:34:29 +0000 (15:34 +0900)
If efl_object_override() is called with a function that does
not exist in the original class, it may lead to a crash on
indexing an non-existing array in the vtable.

This is really just a safety check, as the usage was wrong:
 * You are only allowed to override functions that are defined in the
 * class or any of its interfaces (that is, efl_isa returning true).

src/lib/eo/eo.c

index ebcf041..9884878 100644 (file)
@@ -232,7 +232,10 @@ _vtable_func_set(Eo_Vtable *vtable, const _Efl_Class *klass, Efl_Object_Op op, E
 {
    op_type_funcs *fsrc;
    size_t idx1 = DICH_CHAIN1(op);
-   Dich_Chain1 *chain1 = &vtable->chain[idx1];
+   Dich_Chain1 *chain1;
+
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(idx1 < vtable->size, EINA_FALSE);
+   chain1 = &vtable->chain[idx1];
    _vtable_chain_write_prepare(chain1);
    fsrc = &chain1->chain2->funcs[DICH_CHAIN_LAST(op)];
    if (!allow_same_override && (fsrc->src == klass))