diff --git a/legacy/evas/ChangeLog b/legacy/evas/ChangeLog index 440b1d33d1..2383a3b013 100644 --- a/legacy/evas/ChangeLog +++ b/legacy/evas/ChangeLog @@ -1114,3 +1114,8 @@ 2012-10-19 ChunEon Park (Hermet) * Added Proxy'source visibility set APIs + +2012-10-23 Carsten Haitzler (The Rasterman) + + * Fix possible segfault in gl engine if image->im is null in + image size set. diff --git a/legacy/evas/NEWS b/legacy/evas/NEWS index f847933e5c..79f8adc73d 100644 --- a/legacy/evas/NEWS +++ b/legacy/evas/NEWS @@ -28,6 +28,7 @@ Fixes: * Fix font sizing issue with some rare sizes and fonts when rounding wrong. * Fix software line drawing c fallback code. * Fix the vertical line drawing on gl backened. + * Fix potential segfault in gl engine if image internal image is NULL. Removal: * No more support s3c6410. diff --git a/legacy/evas/src/modules/engines/gl_cocoa/evas_engine.c b/legacy/evas/src/modules/engines/gl_cocoa/evas_engine.c index c5474cf70c..7a28dd4b5d 100644 --- a/legacy/evas/src/modules/engines/gl_cocoa/evas_engine.c +++ b/legacy/evas/src/modules/engines/gl_cocoa/evas_engine.c @@ -684,10 +684,19 @@ eng_image_size_set(void *data, void *image, int w, int h) return image; } im_old = image; - if ((eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P601_PL) || - (eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P709_PL)) - w &= ~0x1; - if ((im_old) && + + switch (eng_image_colorspace_get(data, image)) + { + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + case EVAS_COLORSPACE_YCBCR422601_PL: + case EVAS_COLORSPACE_YCBCR420NV12601_PL: + case EVAS_COLORSPACE_YCBCR420TM12601_PL: + w &= ~0x1; + break; + } + + if ((im_old->im) && ((int)im_old->im->cache_entry.w == w) && ((int)im_old->im->cache_entry.h == h)) return image; diff --git a/legacy/evas/src/modules/engines/gl_sdl/evas_engine.c b/legacy/evas/src/modules/engines/gl_sdl/evas_engine.c index 67a9f1c05b..20bbd325f5 100644 --- a/legacy/evas/src/modules/engines/gl_sdl/evas_engine.c +++ b/legacy/evas/src/modules/engines/gl_sdl/evas_engine.c @@ -606,8 +606,18 @@ eng_image_size_set(void *data, void *image, int w, int h) im->h = h; return image; } + eng_window_use(re->win); + if ((im->tex) && (im->tex->pt->dyn.img)) + { + evas_gl_common_texture_free(im->tex); + im->tex = NULL; + im->w = w; + im->h = h; + im->tex = evas_gl_common_texture_dynamic_new(im->gc, im); + return image; + } im_old = image; - + switch (eng_image_colorspace_get(data, image)) { case EVAS_COLORSPACE_YCBCR422P601_PL: @@ -619,7 +629,9 @@ eng_image_size_set(void *data, void *image, int w, int h) break; } - if ((im_old) && (im_old->im->cache_entry.w == w) && (im_old->im->cache_entry.h == h)) + if ((im_old->im) && + ((int)im_old->im->cache_entry.w == w) && + ((int)im_old->im->cache_entry.h == h)) return image; if (im_old) { diff --git a/legacy/evas/src/modules/engines/gl_x11/evas_engine.c b/legacy/evas/src/modules/engines/gl_x11/evas_engine.c index 3a5f5021ce..abff2e9a4a 100644 --- a/legacy/evas/src/modules/engines/gl_x11/evas_engine.c +++ b/legacy/evas/src/modules/engines/gl_x11/evas_engine.c @@ -2176,7 +2176,7 @@ eng_image_size_set(void *data, void *image, int w, int h) break; } - if ((im_old) && + if ((im_old->im) && ((int)im_old->im->cache_entry.w == w) && ((int)im_old->im->cache_entry.h == h)) return image; diff --git a/legacy/evas/src/modules/engines/wayland_egl/evas_engine.c b/legacy/evas/src/modules/engines/wayland_egl/evas_engine.c index 789a53f255..6385b771a9 100644 --- a/legacy/evas/src/modules/engines/wayland_egl/evas_engine.c +++ b/legacy/evas/src/modules/engines/wayland_egl/evas_engine.c @@ -1683,7 +1683,7 @@ eng_image_size_set(void *data, void *image, int w, int h) break; } - if ((im_old) && + if ((im_old->im) && ((int)im_old->im->cache_entry.w == w) && ((int)im_old->im->cache_entry.h == h)) return image;