eo - fix error case lock not unlocking with shared objects from coverity

this fixes CID 1363294
This commit is contained in:
Carsten Haitzler 2016-09-29 14:14:43 +09:00
parent edf6507b9f
commit f387818a55
2 changed files with 86 additions and 28 deletions

View File

@ -1469,8 +1469,8 @@ efl_isa(const Eo *eo_id, const Efl_Class *klass_id)
return isa;
}
EO_OBJ_POINTER_RETURN_VAL(eo_id, obj, EINA_FALSE);
EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, EINA_FALSE);
EO_OBJ_POINTER_GOTO(eo_id, obj, err_obj);
EO_CLASS_POINTER_GOTO(klass_id, klass, err_class);
const op_type_funcs *func = _vtable_func_get
(obj->vtable, klass->base_id + klass->ops_count);
@ -1489,11 +1489,11 @@ efl_isa(const Eo *eo_id, const Efl_Class *klass_id)
(tdata->cache.klass == klass_id))
{
isa = tdata->cache.isa;
goto shared_ok;
goto done;
}
EO_OBJ_POINTER_RETURN_VAL(eo_id, obj, EINA_FALSE);
EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, EINA_FALSE);
EO_OBJ_POINTER_GOTO(eo_id, obj, err_shared_obj);
EO_CLASS_POINTER_GOTO(klass_id, klass, err_shared_class);
const op_type_funcs *func = _vtable_func_get
(obj->vtable, klass->base_id + klass->ops_count);
@ -1503,10 +1503,21 @@ efl_isa(const Eo *eo_id, const Efl_Class *klass_id)
// Currently implemented by reusing the LAST op id. Just marking it with
// _eo_class_isa_func.
isa = tdata->cache.isa = (func && (func->func == _eo_class_isa_func));
shared_ok:
done:
eina_lock_release(&(_eo_table_data_shared_data->obj_lock));
}
return isa;
err_shared_class:
_EO_POINTER_ERR("Class (%p) is an invalid ref.", klass_id);
err_shared_obj:
eina_lock_release(&(_eo_table_data_shared_data->obj_lock));
return EINA_FALSE;
err_class:
_EO_POINTER_ERR("Class (%p) is an invalid ref.", klass_id);
err_obj:
return EINA_FALSE;
}
EAPI Eo *

View File

@ -13,26 +13,39 @@ void _eo_pointer_error(const char *msg);
#define _EO_POINTER_ERR(fmt, ptr) \
do { char buf[256]; sprintf(buf, fmt, ptr); _eo_pointer_error(buf); } while (0)
#define EO_OBJ_POINTER(obj_id, obj) \
_Eo_Object *obj = NULL; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
#define EO_OBJ_POINTER(obj_id, obj) \
_Eo_Object *obj; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
} while (0)
#define EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, ret) \
_Eo_Object *obj; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
if (!obj) return (ret); \
#define EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, ret) \
_Eo_Object *obj; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
if (!obj) return (ret); \
} while (0)
#define EO_OBJ_POINTER_RETURN(obj_id, obj) \
_Eo_Object *obj; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
if (!obj) return; \
#define EO_OBJ_POINTER_RETURN(obj_id, obj) \
_Eo_Object *obj; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
if (!obj) return; \
} while (0)
#define EO_OBJ_POINTER_GOTO(obj_id, obj, label) \
_Eo_Object *obj; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
if (!obj) goto label; \
} while (0)
#define EO_CLASS_POINTER(klass_id, klass) \
_Efl_Class *klass; \
do { \
klass = _eo_class_pointer_get(klass_id); \
} while (0)
#define EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, ret) \
_Efl_Class *klass; \
do { \
@ -53,19 +66,26 @@ void _eo_pointer_error(const char *msg);
} \
} while (0)
#define EO_CLASS_POINTER_GOTO(klass_id, klass, label) \
_Efl_Class *klass; \
do { \
klass = _eo_class_pointer_get(klass_id); \
if (!klass) goto label; \
} while (0)
#define EO_OBJ_DONE(obj_id) \
_eo_obj_pointer_done((Eo_Id)obj_id)
#else
#define EO_OBJ_POINTER(obj_id, obj) \
_Eo_Object *obj = NULL; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
if (obj && \
!EINA_MAGIC_CHECK((Eo_Header *) obj, EO_EINA_MAGIC)) { \
EINA_MAGIC_FAIL((Eo_Header *) obj, EO_EINA_MAGIC); \
} \
#define EO_OBJ_POINTER(obj_id, obj) \
_Eo_Object *obj; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
if (obj && \
!EINA_MAGIC_CHECK((Eo_Header *) obj, EO_EINA_MAGIC)) { \
EINA_MAGIC_FAIL((Eo_Header *) obj, EO_EINA_MAGIC); \
} \
} while (0)
#define EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, ret) \
@ -84,6 +104,24 @@ void _eo_pointer_error(const char *msg);
EO_MAGIC_RETURN((Eo_Header *) obj, EO_EINA_MAGIC); \
} while (0)
#define EO_OBJ_POINTER_GOTO(obj_id, obj, label) \
_Eo_Object *obj; \
do { \
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
if (!obj || \
!EINA_MAGIC_CHECK((Eo_Header *) obj, EO_EINA_MAGIC)) goto label; \
} while (0)
#define EO_CLASS_POINTER(klass_id, klass) \
_Efl_Class *klass; \
do { \
klass = _eo_class_pointer_get(klass_id); \
if (klass && \
!EINA_MAGIC_CHECK((Eo_Header *) klas, EO_CLASS_EINA_MAGIC)) { \
EO_MAGIC_FAIL((Eo_Header *) klass, EO_CLASS_EINA_MAGIC); \
} \
} while (0)
#define EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, ret) \
_Efl_Class *klass; \
do { \
@ -100,6 +138,15 @@ void _eo_pointer_error(const char *msg);
EO_MAGIC_RETURN((Eo_Header *) klass, EO_CLASS_EINA_MAGIC); \
} while (0)
#define EO_CLASS_POINTER_GOTO(klass_id, klass, label) \
_Efl_Class *klass; \
do { \
klass = _eo_class_pointer_get(klass_id); \
if (!klass) goto label; \
if (klass && \
!EINA_MAGIC_CHECK((Eo_Header *) klas, EO_CLASS_EINA_MAGIC)) { \
} while (0)
#define EO_OBJ_DONE(obj_id)
#endif