evas filter: fix crash issue

Summary:
If image object geometry is same with image size, then a crash occurs on both
GL and SW engine.

[Test Code]
evas_object_image_size_get(img, &w, &h);
evas_object_resize(img, w, h);

[GL engine]
eng_ector_buffer_wrap should use output instead of engine for calling
evas_ector_buffer_engine_image, because it expects the output not the engine.

[SW engine]
eng_ector_buffer_wrap should check if im->image.data is NULL because
_evas_ector_software_buffer_evas_ector_buffer_engine_image_set returns before
calling evas_cache_iamge_ref if im->image.data is NULL, and it causes
a segmentation fault finally with following backtrace.

(#0) evas_cache_image_drop (im=0x0)
(#1) _evas_ector_software_buffer_efl_object_destructor
(#2) efl_destructor
(#3) _efl_del_internal
(#4) _efl_unref_internal
(#5) _efl_add_internal_end
(#6) _efl_add_end
(#7) eng_ector_buffer_wrap

Test Plan: {F3841366}

Reviewers: Hermet, jsuya

Reviewed By: Hermet

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D11258
This commit is contained in:
Shinwoo Kim 2020-01-31 21:34:49 +09:00 committed by Hermet Park
parent 4697438b26
commit e0b4ddaeb8
3 changed files with 8 additions and 1 deletions

View File

@ -608,6 +608,8 @@ evas_filter_buffer_backing_set(Evas_Filter_Context *ctx, int bufid,
if (fb->is_render) goto end;
buffer = ENFN->ector_buffer_wrap(ENC, ctx->evas->evas, engine_buffer);
if (!buffer) return EINA_FALSE;
ret = EINA_TRUE;
end:

View File

@ -2564,11 +2564,14 @@ static Ector_Buffer *
eng_ector_buffer_wrap(void *engine EINA_UNUSED, Evas *evas, void *engine_image)
{
Evas_GL_Image *im = engine_image;
Render_Output_GL_Generic *output;
EINA_SAFETY_ON_NULL_RETURN_VAL(engine_image, NULL);
output = _evgl_output_find(engine);
if (!output) return NULL;
return efl_add(EVAS_ECTOR_GL_IMAGE_BUFFER_CLASS, evas,
evas_ector_buffer_engine_image_set(efl_added, evas, im));
evas_ector_buffer_engine_image_set(efl_added, output, im));
}
//FIXME: Currently Ector GL doens't work properly. Use software instead.

View File

@ -4275,8 +4275,10 @@ eng_ector_buffer_wrap(void *data, Evas *e EINA_UNUSED, void *engine_image)
{
Image_Entry *ie = engine_image;
Ector_Buffer *buf = NULL;
RGBA_Image *im = (RGBA_Image *)ie;
if (!ie) return NULL;
if (!im->image.data) return NULL;
if (!efl_domain_current_push(EFL_ID_DOMAIN_SHARED))
return NULL;