evas - fix new issue with segv when switching to alpha win with gl
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Tue, 28 Oct 2014 11:09:33 +0000 (20:09 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Tue, 28 Oct 2014 11:10:40 +0000 (20:10 +0900)
evas gl window was freed before new one was created getting shared ctx
to 0 refcount thus freeing everything there - BAD. fix. new issue in
git, not from release

src/modules/evas/engines/gl_x11/evas_engine.c

index 1fe13be..a9f03eb 100644 (file)
@@ -1433,9 +1433,9 @@ eng_setup(Evas *eo_e, void *in)
                  (info->info.depth != eng_get_ob(re)->depth) ||
                  (info->info.destination_alpha != eng_get_ob(re)->alpha))
                {
-                  Outbuf *ob;
+                  Outbuf *ob, *ob_old;
 
-                  eng_window_free(eng_get_ob(re));
+                  ob_old = re->generic.software.ob;
                   re->generic.software.ob = NULL;
                   gl_wins--;
 
@@ -1453,17 +1453,16 @@ eng_setup(Evas *eo_e, void *in)
                                       swap_mode);
                   if (!ob)
                     {
+                       if (ob_old) eng_window_free(ob_old);
                        free(re);
                        return 0;
                     }
                   eng_window_use(ob);
-                  if (ob)
-                    {
-                       evas_render_engine_software_generic_update(&re->generic.software, ob,
-                                                                  e->output.w, e->output.h);
+                  if (ob_old) eng_window_free(ob_old);
+                  evas_render_engine_software_generic_update(&re->generic.software, ob,
+                                                             e->output.w, e->output.h);
 
-                       gl_wins++;
-                    }
+                  gl_wins++;
                }
              else if ((eng_get_ob(re)->w != e->output.w) ||
                       (eng_get_ob(re)->h != e->output.h) ||