summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@samsung.com>2019-07-19 15:44:58 -0400
committerCedric BAIL <cedric.bail@free.fr>2019-07-19 15:05:00 -0700
commitdc1630d49668acc305538fb4ec3fc433fb79d54e (patch)
tree86081cb7c3f6bf4f3f8e528456f00423844727e6
parent17f433c57bfa11319a22fde1aedb21e99a3a1268 (diff)
downloadefl-dc1630d49668acc305538fb4ec3fc433fb79d54e.tar.gz
evas: fix type checking of Evas pointers in legacy functions
many of these functions go directly to evas internals with no eo checks, and the existing "MAGIC_CHECK" macro has somehow become a useless null check type checking here is important in order to avoid crazy behavior when the wrong object types are passed @fix Reviewed-by: Cedric BAIL <cedric.bail@free.fr> Differential Revision: https://phab.enlightenment.org/D9364
-rw-r--r--src/lib/evas/canvas/evas_main.c47
-rw-r--r--src/lib/evas/canvas/evas_render.c2
-rw-r--r--src/lib/evas/include/evas_private.h12
3 files changed, 29 insertions, 32 deletions
diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index 84854cddf7..d246bdc60b 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -357,9 +357,8 @@ _evas_canvas_efl_object_constructor(Eo *eo_obj, Evas_Public_Data *e)
EAPI void
evas_free(Evas *eo_e)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
+ if (!eo_e) return;
+ EVAS_TYPE_CHECK(eo_e);
if (efl_parent_get(eo_e))
efl_del(eo_e);
else
@@ -1230,9 +1229,7 @@ _evas_canvas_efl_canvas_scene_image_max_size_get(const Eo *eo_e EINA_UNUSED, Eva
EAPI void
evas_output_framespace_set(Evas *eo_e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
+ EVAS_TYPE_CHECK(eo_e);
Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
@@ -1251,9 +1248,7 @@ evas_output_framespace_set(Evas *eo_e, Evas_Coord x, Evas_Coord y, Evas_Coord w,
EAPI void
evas_output_framespace_get(const Evas *eo_e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
+ EVAS_TYPE_CHECK(eo_e);
Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
@@ -1266,9 +1261,7 @@ evas_output_framespace_get(const Evas *eo_e, Evas_Coord *x, Evas_Coord *y, Evas_
EAPI void
evas_output_method_set(Evas *eo_e, int render_method)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
+ EVAS_TYPE_CHECK(eo_e);
Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
@@ -1340,9 +1333,7 @@ evas_output_method_set(Evas *eo_e, int render_method)
EAPI int
evas_output_method_get(const Evas *eo_e)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return RENDER_METHOD_INVALID;
- MAGIC_CHECK_END();
+ EVAS_TYPE_CHECK(eo_e, RENDER_METHOD_INVALID);
Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
@@ -1352,9 +1343,7 @@ evas_output_method_get(const Evas *eo_e)
EAPI void
evas_output_size_set(Evas *eo_e, int w, int h)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
+ EVAS_TYPE_CHECK(eo_e);
Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
@@ -1382,9 +1371,7 @@ evas_output_size_set(Evas *eo_e, int w, int h)
EAPI void
evas_output_size_get(const Evas *eo_e, int *w, int *h)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
+ EVAS_TYPE_CHECK(eo_e);
Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
@@ -1395,9 +1382,7 @@ evas_output_size_get(const Evas *eo_e, int *w, int *h)
EAPI void
evas_output_viewport_set(Evas *eo_e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
+ EVAS_TYPE_CHECK(eo_e);
Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
@@ -1425,9 +1410,7 @@ evas_output_viewport_set(Evas *eo_e, Evas_Coord x, Evas_Coord y, Evas_Coord w, E
EAPI void
evas_output_viewport_get(const Evas *eo_e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
+ EVAS_TYPE_CHECK(eo_e);
Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
@@ -1961,9 +1944,7 @@ evas_font_hinting_can_hint(const Evas *eo_e, Evas_Font_Hinting_Flags hinting)
EAPI void
evas_font_available_list_free(Evas *eo_e, Eina_List *available)
{
- MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS);
- return;
- MAGIC_CHECK_END();
+ EVAS_TYPE_CHECK(eo_e);
evas_font_dir_available_list_free(available);
}
@@ -1978,7 +1959,7 @@ _evas_canvas_efl_canvas_scene_group_objects_calculate(Eo *eo_e, Evas_Public_Data
EAPI void
evas_smart_objects_calculate(Eo *eo_e)
{
- EINA_SAFETY_ON_NULL_RETURN(eo_e);
+ EVAS_TYPE_CHECK(eo_e);
evas_call_smarts_calculate(eo_e);
}
@@ -1991,6 +1972,7 @@ _evas_canvas_efl_canvas_scene_group_objects_calculating_get(const Eo *eo_e EINA_
EAPI Eina_Bool
evas_smart_objects_calculating_get(const Eo *obj)
{
+ EVAS_TYPE_CHECK(obj, EINA_FALSE);
return efl_canvas_scene_group_objects_calculating_get(obj);
}
@@ -2004,18 +1986,21 @@ _evas_canvas_smart_objects_calculate_count_get(const Eo *eo_e EINA_UNUSED, Evas_
EAPI Eina_Bool
evas_pointer_inside_get(const Evas *obj)
{
+ EVAS_TYPE_CHECK(obj, EINA_FALSE);
return efl_canvas_pointer_inside_get(obj, NULL);
}
EAPI Eina_Bool
evas_pointer_inside_by_device_get(const Evas *obj, Eo *dev)
{
+ EVAS_TYPE_CHECK(obj, EINA_FALSE);
return efl_canvas_pointer_inside_get(obj, dev);
}
EAPI Eina_List*
evas_objects_at_xy_get(Eo *eo_e, int x, int y, Eina_Bool include_pass_events_objects, Eina_Bool include_hidden_objects)
{
+ EVAS_TYPE_CHECK(eo_e, NULL);
return _efl_canvas_evas_canvas_objects_at_xy_get_helper(eo_e, efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS), x, y, include_pass_events_objects, include_hidden_objects);
}
/* Internal EO APIs */
diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c
index 074dc1d618..0a8d8a6748 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -2864,7 +2864,7 @@ evas_render_pre(Evas *eo_e, Evas_Public_Data *evas)
EAPI void
evas_render_pending_objects_flush(Evas *eo_e)
{
- Evas_Public_Data *evas = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
+ Evas_Public_Data *evas = efl_data_scope_safe_get(eo_e, EVAS_CANVAS_CLASS);
EINA_SAFETY_ON_NULL_RETURN(evas);
evas_render_pre(eo_e, evas);
}
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 751f81cd07..2c6dcdd990 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -517,7 +517,19 @@ OPAQUE_TYPE(Evas_Font_Instance); /* General type for RGBA_Font_Int */
#define MAGIC_MAP 0x7575177d
#define MAGIC_DEV 0x7d773738
+#define EVAS_TYPE_CHECK(obj, ...) \
+ do { \
+ if (!efl_isa((obj), EVAS_CANVAS_CLASS)) \
+ { \
+ CRI("non-Evas passed to %s", __func__); \
+ return __VA_ARGS__; \
+ } \
+ } \
+ while (0)
+
#ifdef EINA_MAGIC_DEBUG
+
+
# define MAGIC_CHECK_FAILED(o, t, m) \
{evas_debug_error(); \
if (!o) evas_debug_input_null(); \