jpeg pushed a commit to branch master.

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

commit e531ab9bc028286c7738693a621a9aae626a3cfb
Author: Jean-Philippe Andre <[email protected]>
Date:   Mon Mar 2 19:51:30 2015 +0900

    Evas GL: Use Eina_Strbuf for the extensions list
    
    The usage of strcat/strncat was not safe, and even Coverity reported
    about it.
    
    Fixes CID 1256197:
    CID 1256197 (#1 of 2): Buffer not null terminated (BUFFER_SIZE_WARNING)
    1. buffer_size_warning: Calling strncpy with a maximum size argument
    of 10240 bytes on destination array _gl_ext_string of size 10240 bytes
    might leave the destination string unterminated.
---
 .../evas/engines/gl_common/evas_gl_api_ext.c       | 64 ++++++++--------------
 1 file changed, 23 insertions(+), 41 deletions(-)

diff --git a/src/modules/evas/engines/gl_common/evas_gl_api_ext.c 
b/src/modules/evas/engines/gl_common/evas_gl_api_ext.c
index 87869ed..a8b024e 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_api_ext.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_api_ext.c
@@ -3,13 +3,10 @@
 
 #include <dlfcn.h>
 
-
-#define MAX_EXTENSION_STRING_BUFFER 10240
-
 // list of exts like "discard_framebuffer GL_EXT_discard_framebuffer 
multi_draw_arrays GL_EXT_multi_draw_arrays"
-char _gl_ext_string[MAX_EXTENSION_STRING_BUFFER] = { 0 };
+static char *_gl_ext_string = NULL;
 // list of exts by official name only like "GL_EXT_discard_framebuffer 
GL_EXT_multi_draw_arrays"
-char _gl_ext_string_official[MAX_EXTENSION_STRING_BUFFER] = { 0 };
+static char *_gl_ext_string_official = NULL;
 // list of gles 1.1 exts by official name
 static char *_gles1_ext_string = NULL;
 
@@ -306,9 +303,8 @@ evgl_api_ext_init(void *getproc, const char *glueexts)
    const char *glexts;
    fp_getproc gp = (fp_getproc)getproc;
    int _curext_supported = 0;
-
-   memset(_gl_ext_string, 0, MAX_EXTENSION_STRING_BUFFER);
-   memset(_gl_ext_string_official, 0, MAX_EXTENSION_STRING_BUFFER);
+   Eina_Strbuf *sb = eina_strbuf_new();
+   Eina_Strbuf *sboff = eina_strbuf_new();
 
 #ifndef GL_GLES
    /* Add some extension strings that are always working on desktop GL */
@@ -316,8 +312,8 @@ evgl_api_ext_init(void *getproc, const char *glueexts)
          "GL_EXT_read_format_bgra "
          "GL_EXT_texture_format_BGRA8888 "
          "GL_EXT_texture_type_2_10_10_10_REV ";
-   strncpy(_gl_ext_string, desktop_exts, MAX_EXTENSION_STRING_BUFFER);
-   strncpy(_gl_ext_string_official, desktop_exts, MAX_EXTENSION_STRING_BUFFER);
+   eina_strbuf_append(sb, desktop_exts);
+   eina_strbuf_append(sboff, desktop_exts);
 #endif
 
    // GLES Extensions
@@ -328,18 +324,6 @@ evgl_api_ext_init(void *getproc, const char *glueexts)
         return EINA_FALSE;
      }
 
-   /*
-   // GLUE Extensions
-#ifdef GL_GLES
-getproc = &eglGetProcAddress;
-glueexts = eglQueryString(re->win->egl_disp, EGL_EXTENSIONS);
-#else
-getproc = &glXGetProcAddress;
-glueexts = glXQueryExtensionsString(re->info->info.display,
-re->info->info.screen);
-#endif
-    */
-
    
/////////////////////////////////////////////////////////////////////////////////////////////////////
    // Extension HEADER
    
/////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -419,16 +403,13 @@ re->info->info.screen);
 #undef GETPROCADDR
    
/////////////////////////////////////////////////////////////////////////////////////////////////////
 
-       _gl_ext_string[0] = 0x00; //NULL;
-       _gl_ext_string_official[0] = 0x00;
-
    
/////////////////////////////////////////////////////////////////////////////////////////////////////
    // Extension HEADER
    
/////////////////////////////////////////////////////////////////////////////////////////////////////
 #define _EVASGL_EXT_BEGIN(name) \
      if (_gl_ext_support_##name != 0) \
        { \
-          strncat(_gl_ext_string, #name" ", MAX_EXTENSION_STRING_BUFFER); \
+          eina_strbuf_append(sb, #name" "); \
           _curext_supported = 1; \
        } \
      else _curext_supported = 0;
@@ -438,9 +419,9 @@ re->info->info.screen);
 #define _EVASGL_EXT_DISCARD_SUPPORT()
 #define _EVASGL_EXT_DRVNAME_PRINT(name) \
        { \
-          strncat(_gl_ext_string, name" ", MAX_EXTENSION_STRING_BUFFER); \
-          if ((strncmp(name, "GL", 2) == 0) && 
(strstr(_gl_ext_string_official, name) == NULL)) \
-            strncat(_gl_ext_string_official, name" ", 
MAX_EXTENSION_STRING_BUFFER); \
+          eina_strbuf_append(sb, name" "); \
+          if ((strncmp(name, "GL_", 3) == 0) && 
(strstr(eina_strbuf_string_get(sboff), name) == NULL)) \
+            eina_strbuf_append(sboff, name" "); \
        }
 #define _EVASGL_EXT_DRVNAME(name) \
      if (_curext_supported) \
@@ -474,8 +455,12 @@ re->info->info.screen);
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
    
/////////////////////////////////////////////////////////////////////////////////////////////////////
 
-   _gl_ext_string[MAX_EXTENSION_STRING_BUFFER - 1] = '\0';
-   _gl_ext_string_official[MAX_EXTENSION_STRING_BUFFER - 1] = '\0';
+   if (_gl_ext_string) free(_gl_ext_string);
+   if (_gl_ext_string_official) free(_gl_ext_string_official);
+   _gl_ext_string = eina_strbuf_string_steal(sb);
+   _gl_ext_string_official = eina_strbuf_string_steal(sboff);
+   eina_strbuf_free(sb);
+   eina_strbuf_free(sboff);
 
   _evgl_api_ext_status = 1;
    return EINA_TRUE;
@@ -554,6 +539,7 @@ _evgl_api_gles1_ext_init(void)
    EVGL_Resource *rsc;
    EGLint context_version;
    EGLDisplay dpy = EGLDISPLAY_GET();
+   Eina_Strbuf *sb = eina_strbuf_new();
 
    /* glGetString returns the information for the currently bound context
     * So, update gles1_exts only if GLES1 context is currently bound.
@@ -597,14 +583,6 @@ _evgl_api_gles1_ext_init(void)
         return EINA_FALSE;
      }
 
-   if (!_gles1_ext_string)
-     {
-        _gles1_ext_string = calloc(MAX_EXTENSION_STRING_BUFFER, 1);
-        if (!_gles1_ext_string) return EINA_FALSE;
-     }
-
-   _gles1_ext_string[0] = '\0';
-
    
/////////////////////////////////////////////////////////////////////////////////////////////////////
    // Scanning supported extensions, sets the variables
    
/////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -701,8 +679,8 @@ _evgl_api_gles1_ext_init(void)
 #define _EVASGL_EXT_DISCARD_SUPPORT()
 #define _EVASGL_EXT_DRVNAME_PRINT(name) \
      { \
-        if ((strncmp(name, "GL", 2) == 0) && (strstr(_gles1_ext_string, name) 
== NULL)) \
-          strcat(_gles1_ext_string, name" "); \
+        if ((strncmp(name, "GL_", 3) == 0) && 
(strstr(eina_strbuf_string_get(sb), name) == NULL)) \
+          eina_strbuf_append(sb, name" "); \
      }
 #define _EVASGL_EXT_DRVNAME(name) \
    if (_curext_supported) \
@@ -735,6 +713,10 @@ _evgl_api_gles1_ext_init(void)
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC
 #undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
 
+   if (_gles1_ext_string) free(_gles1_ext_string);
+   _gles1_ext_string = eina_strbuf_string_steal(sb);
+   eina_strbuf_free(sb);
+
    if (evgl_engine->api_debug_mode)
      DBG("GLES1: List of supported extensions:\n%s", _gles1_ext_string);
 

-- 


Reply via email to