hermet pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=f6f67d60f3c2171a7e96cff2a205d4895c13117c

commit f6f67d60f3c2171a7e96cff2a205d4895c13117c
Author: Hermet Park <hermetp...@gmail.com>
Date:   Thu Jan 9 15:00:22 2020 +0900

    evas ector: ++safety.
    
    add return value by ector_begin() for vector safety.
---
 src/lib/evas/canvas/efl_canvas_vg_object.c              | 8 +++++++-
 src/lib/evas/include/evas_private.h                     | 2 +-
 src/modules/evas/engines/gl_generic/evas_engine.c       | 6 ++++--
 src/modules/evas/engines/software_generic/evas_engine.c | 7 +++++--
 4 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/lib/evas/canvas/efl_canvas_vg_object.c 
b/src/lib/evas/canvas/efl_canvas_vg_object.c
index c94cf28b48..60008de27a 100644
--- a/src/lib/evas/canvas/efl_canvas_vg_object.c
+++ b/src/lib/evas/canvas/efl_canvas_vg_object.c
@@ -519,7 +519,11 @@ _render_to_buffer(Evas_Object_Protected_Data *obj, 
Efl_Canvas_Vg_Object_Data *pd
    _evas_vg_render_pre(obj, root, engine, buffer, context, ector, NULL, 255, 
NULL, 0);
 
    //Actual content drawing
-   ENFN->ector_begin(engine, buffer, context, ector, 0, 0, do_async);
+   if (!ENFN->ector_begin(engine, buffer, context, ector, 0, 0, do_async))
+     {
+        ERR("Failed ector begin!");
+        return NULL;
+     }
 
    //draw on buffer
    _evas_vg_render(obj, pd,
@@ -546,6 +550,8 @@ _render_buffer_to_screen(Evas_Object_Protected_Data *obj,
                          int x, int y, int w, int h,
                          Eina_Bool do_async, Eina_Bool cacheable)
 {
+   if (!buffer) return;
+
    Eina_Bool async_unref;
 
    //Draw the buffer as image to canvas
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index aacbe016f8..e57910f930 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1514,7 +1514,7 @@ struct _Evas_Func
    void  (*ector_destroy)                (void *engine, Ector_Surface 
*surface);
    Ector_Buffer *(*ector_buffer_wrap)    (void *engine, Evas *e, void 
*engine_image);
    Ector_Buffer *(*ector_buffer_new)     (void *engine, Evas *e, int width, 
int height, Efl_Gfx_Colorspace cspace, Ector_Buffer_Flag flags);
-   void  (*ector_begin)                  (void *engine, void *output, void 
*context, Ector_Surface *ector, int x, int y, Eina_Bool do_async);
+   Eina_Bool  (*ector_begin)             (void *engine, void *output, void 
*context, Ector_Surface *ector, int x, int y, Eina_Bool do_async);
    void  (*ector_renderer_draw)          (void *engine, void *output, void 
*context, Ector_Renderer *r, Eina_Array *clips, Eina_Bool do_async);
    void  (*ector_end)                    (void *engine, void *output, void 
*context, Ector_Surface *ector, Eina_Bool do_async);
 
diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c 
b/src/modules/evas/engines/gl_generic/evas_engine.c
index 045323b680..ec14e2bacc 100644
--- a/src/modules/evas/engines/gl_generic/evas_engine.c
+++ b/src/modules/evas/engines/gl_generic/evas_engine.c
@@ -2712,7 +2712,7 @@ eng_ector_surface_cache_drop(void *engine, void *key)
    generic_cache_data_drop(e->software.surface_cache, key);
 }
 
-static void
+static Eina_Bool
 eng_ector_begin(void *engine, void *surface,
                 void *context EINA_UNUSED, Ector_Surface *ector,
                 int x, int y, Eina_Bool do_async EINA_UNUSED)
@@ -2720,6 +2720,7 @@ eng_ector_begin(void *engine, void *surface,
    if (use_gl)
      {
         //FIXME: No implementation yet
+        return EINA_FALSE;
      }
    else
      {
@@ -2729,6 +2730,7 @@ eng_ector_begin(void *engine, void *surface,
         int load_err;
 
         glim = eng_image_data_get(engine, glim, EINA_TRUE, &pixels, 
&load_err,NULL);
+        if (!glim || !pixels) return EINA_FALSE;
         eng_image_stride_get(engine, glim, &stride);
         eng_image_size_get(engine, glim, &w, &h);
 
@@ -2737,8 +2739,8 @@ eng_ector_begin(void *engine, void *surface,
         // it just uses the software backend to draw for now
         ector_buffer_pixels_set(ector, pixels, w, h, stride, 
EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
         ector_surface_reference_point_set(ector, x, y);
-
      }
+   return EINA_TRUE;
 }
 
 static void
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c 
b/src/modules/evas/engines/software_generic/evas_engine.c
index 33c56b1238..b548322539 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -4463,7 +4463,7 @@ _draw_thread_ector_surface_set(void *data)
    eina_mempool_free(_mp_command_ector_surface, ector_surface);
 }
 
-static void
+static Eina_Bool
 eng_ector_begin(void *engine EINA_UNUSED, void *surface,
                 void *context EINA_UNUSED, Ector_Surface *ector,
                 int x, int y, Eina_Bool do_async)
@@ -4473,7 +4473,7 @@ eng_ector_begin(void *engine EINA_UNUSED, void *surface,
         Evas_Thread_Command_Ector_Surface *nes;
 
         nes = eina_mempool_malloc(_mp_command_ector_surface, sizeof 
(Evas_Thread_Command_Ector_Surface));
-        if (!nes) return;
+        if (!nes) return EINA_FALSE;
 
         nes->ector = ector;
         nes->pixels = surface;
@@ -4490,6 +4490,8 @@ eng_ector_begin(void *engine EINA_UNUSED, void *surface,
         unsigned int h = 0;
 
         pixels = evas_cache_image_pixels(&sf->cache_entry);
+        if (!pixels) return EINA_FALSE;
+
         w = sf->cache_entry.w;
         h = sf->cache_entry.h;
         // clear the surface before giving to ector
@@ -4498,6 +4500,7 @@ eng_ector_begin(void *engine EINA_UNUSED, void *surface,
         ector_buffer_pixels_set(ector, pixels, w, h, 0, 
EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
         ector_surface_reference_point_set(ector, x, y);
      }
+   return EINA_TRUE;
 }
 
 static void

-- 


Reply via email to