forked from enlightenment/efl
eo - fix error case lock not unlocking with shared objects from coverity
this fixes CID 1363294
This commit is contained in:
parent
edf6507b9f
commit
f387818a55
|
@ -1469,8 +1469,8 @@ efl_isa(const Eo *eo_id, const Efl_Class *klass_id)
|
||||||
return isa;
|
return isa;
|
||||||
}
|
}
|
||||||
|
|
||||||
EO_OBJ_POINTER_RETURN_VAL(eo_id, obj, EINA_FALSE);
|
EO_OBJ_POINTER_GOTO(eo_id, obj, err_obj);
|
||||||
EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, EINA_FALSE);
|
EO_CLASS_POINTER_GOTO(klass_id, klass, err_class);
|
||||||
const op_type_funcs *func = _vtable_func_get
|
const op_type_funcs *func = _vtable_func_get
|
||||||
(obj->vtable, klass->base_id + klass->ops_count);
|
(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))
|
(tdata->cache.klass == klass_id))
|
||||||
{
|
{
|
||||||
isa = tdata->cache.isa;
|
isa = tdata->cache.isa;
|
||||||
goto shared_ok;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
EO_OBJ_POINTER_RETURN_VAL(eo_id, obj, EINA_FALSE);
|
EO_OBJ_POINTER_GOTO(eo_id, obj, err_shared_obj);
|
||||||
EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, EINA_FALSE);
|
EO_CLASS_POINTER_GOTO(klass_id, klass, err_shared_class);
|
||||||
const op_type_funcs *func = _vtable_func_get
|
const op_type_funcs *func = _vtable_func_get
|
||||||
(obj->vtable, klass->base_id + klass->ops_count);
|
(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
|
// Currently implemented by reusing the LAST op id. Just marking it with
|
||||||
// _eo_class_isa_func.
|
// _eo_class_isa_func.
|
||||||
isa = tdata->cache.isa = (func && (func->func == _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));
|
eina_lock_release(&(_eo_table_data_shared_data->obj_lock));
|
||||||
}
|
}
|
||||||
return isa;
|
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 *
|
EAPI Eo *
|
||||||
|
|
|
@ -13,26 +13,39 @@ void _eo_pointer_error(const char *msg);
|
||||||
#define _EO_POINTER_ERR(fmt, ptr) \
|
#define _EO_POINTER_ERR(fmt, ptr) \
|
||||||
do { char buf[256]; sprintf(buf, fmt, ptr); _eo_pointer_error(buf); } while (0)
|
do { char buf[256]; sprintf(buf, fmt, ptr); _eo_pointer_error(buf); } while (0)
|
||||||
|
|
||||||
#define EO_OBJ_POINTER(obj_id, obj) \
|
#define EO_OBJ_POINTER(obj_id, obj) \
|
||||||
_Eo_Object *obj = NULL; \
|
_Eo_Object *obj; \
|
||||||
do { \
|
do { \
|
||||||
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
|
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, ret) \
|
#define EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, ret) \
|
||||||
_Eo_Object *obj; \
|
_Eo_Object *obj; \
|
||||||
do { \
|
do { \
|
||||||
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
|
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
|
||||||
if (!obj) return (ret); \
|
if (!obj) return (ret); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define EO_OBJ_POINTER_RETURN(obj_id, obj) \
|
#define EO_OBJ_POINTER_RETURN(obj_id, obj) \
|
||||||
_Eo_Object *obj; \
|
_Eo_Object *obj; \
|
||||||
do { \
|
do { \
|
||||||
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
|
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
|
||||||
if (!obj) return; \
|
if (!obj) return; \
|
||||||
} while (0)
|
} 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) \
|
#define EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, ret) \
|
||||||
_Efl_Class *klass; \
|
_Efl_Class *klass; \
|
||||||
do { \
|
do { \
|
||||||
|
@ -53,19 +66,26 @@ void _eo_pointer_error(const char *msg);
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} 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) \
|
#define EO_OBJ_DONE(obj_id) \
|
||||||
_eo_obj_pointer_done((Eo_Id)obj_id)
|
_eo_obj_pointer_done((Eo_Id)obj_id)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define EO_OBJ_POINTER(obj_id, obj) \
|
#define EO_OBJ_POINTER(obj_id, obj) \
|
||||||
_Eo_Object *obj = NULL; \
|
_Eo_Object *obj; \
|
||||||
do { \
|
do { \
|
||||||
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
|
obj = _eo_obj_pointer_get((Eo_Id)obj_id); \
|
||||||
if (obj && \
|
if (obj && \
|
||||||
!EINA_MAGIC_CHECK((Eo_Header *) obj, EO_EINA_MAGIC)) { \
|
!EINA_MAGIC_CHECK((Eo_Header *) obj, EO_EINA_MAGIC)) { \
|
||||||
EINA_MAGIC_FAIL((Eo_Header *) obj, EO_EINA_MAGIC); \
|
EINA_MAGIC_FAIL((Eo_Header *) obj, EO_EINA_MAGIC); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, ret) \
|
#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); \
|
EO_MAGIC_RETURN((Eo_Header *) obj, EO_EINA_MAGIC); \
|
||||||
} while (0)
|
} 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) \
|
#define EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, ret) \
|
||||||
_Efl_Class *klass; \
|
_Efl_Class *klass; \
|
||||||
do { \
|
do { \
|
||||||
|
@ -100,6 +138,15 @@ void _eo_pointer_error(const char *msg);
|
||||||
EO_MAGIC_RETURN((Eo_Header *) klass, EO_CLASS_EINA_MAGIC); \
|
EO_MAGIC_RETURN((Eo_Header *) klass, EO_CLASS_EINA_MAGIC); \
|
||||||
} while (0)
|
} 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)
|
#define EO_OBJ_DONE(obj_id)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue