Evas GL: Fix potential crash
authorJean-Philippe Andre <jp.andre@samsung.com>
Wed, 29 Oct 2014 03:56:00 +0000 (12:56 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Wed, 29 Oct 2014 06:12:53 +0000 (15:12 +0900)
Welp, it looks like this crash actually happened once even though
it should not. glGetString() seems to have returned NULL somehow.

src/modules/evas/engines/gl_common/evas_gl_api_ext.c
src/modules/evas/engines/gl_common/evas_gl_api_ext.h
src/modules/evas/engines/gl_common/evas_gl_core.c

index 8b86b53..9addf61 100644 (file)
@@ -238,7 +238,7 @@ evgl_evasglWaitSync(Evas_GL *evas_gl EINA_UNUSED,
 
 static int _evgl_api_ext_status = 0;
 
-void
+Eina_Bool
 evgl_api_ext_init(void *getproc, const char *glueexts)
 {
    const char *glexts;
@@ -258,6 +258,12 @@ evgl_api_ext_init(void *getproc, const char *glueexts)
 
    // GLES Extensions
    glexts = (const char*)glGetString(GL_EXTENSIONS);
+   if (!glexts)
+     {
+        ERR("glGetString returned NULL! Something is very wrong...");
+        return EINA_FALSE;
+     }
+
    /*
    // GLUE Extensions
 #ifdef GL_GLES
@@ -352,6 +358,7 @@ re->info->info.screen);
 
 
    _evgl_api_ext_status = 1;
+   return EINA_TRUE;
 }
 
 void
index 535903a..31f7873 100644 (file)
@@ -67,7 +67,7 @@
 /////////////////////////////////////////////////////////////////////////////////////////////////////
 #define EXTENSION_SUPPORT(name) (_gl_ext_support_##name == 1)
 
-extern void evgl_api_ext_init(void *getproc, const char *glueexts);
+extern Eina_Bool evgl_api_ext_init(void *getproc, const char *glueexts);
 extern void evgl_api_ext_get(Evas_GL_API *gl_funcs);
 extern const char *evgl_api_ext_string_get();
 
index 78ae9e0..fb56d00 100644 (file)
@@ -1400,9 +1400,15 @@ evgl_engine_init(void *eng_data, const EVGL_Interface *efunc)
 
    // Initialize Extensions
    if (efunc->proc_address_get && efunc->ext_string_get)
-      evgl_api_ext_init(efunc->proc_address_get, efunc->ext_string_get(eng_data));
+     {
+        if (!evgl_api_ext_init(efunc->proc_address_get, efunc->ext_string_get(eng_data)))
+          {
+             ERR("Extensions failed to load. This shouldn't happen, Evas GL load fails.");
+             goto error;
+          }
+     }
    else
-      ERR("Proc address get function not available.  Extension not initialized.");
+     ERR("Proc address get function not available. Extensions not initialized.");
 
    if (efunc->ext_string_get)
      DBG("GLUE Extension String: %s", efunc->ext_string_get(eng_data));