evas: fix type checking of Evas pointers in legacy functions
authorMike Blumenkrantz <zmike@samsung.com>
Fri, 19 Jul 2019 19:44:58 +0000 (15:44 -0400)
committerSangHyeon Jade Lee <sh10233.lee@samsung.com>
Tue, 23 Jul 2019 05:04:43 +0000 (14:04 +0900)
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

src/lib/evas/canvas/evas_main.c
src/lib/evas/canvas/evas_render.c
src/lib/evas/include/evas_private.h

index 371371a..7770355 100644 (file)
@@ -372,9 +372,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
@@ -1245,9 +1244,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);
 
@@ -1266,9 +1263,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);
 
@@ -1281,9 +1276,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);
 
@@ -1357,9 +1350,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);
 
@@ -1369,9 +1360,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);
 
@@ -1399,9 +1388,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);
 
@@ -1412,9 +1399,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);
 
@@ -1442,9 +1427,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);
 
@@ -1978,9 +1961,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);
 }
@@ -1995,7 +1976,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);
 }
 
@@ -2008,6 +1989,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);
 }
 
@@ -2021,18 +2003,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 */
index b24ba62..596bca8 100644 (file)
@@ -2894,7 +2894,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);
 }
index 1f9f3fa..15e50b7 100755 (executable)
@@ -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(); \