From: Brian Paul Date: Thu, 24 Mar 2011 17:39:21 +0000 (-0600) Subject: mesa: new MESA_EXTENSION_MAX_YEAR env var X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=82dd62fb22c8f88d62e3c77666c6805a2ac6ecd3;p=mesa.git mesa: new MESA_EXTENSION_MAX_YEAR env var If set to year X, only report extensions up to that year. This is a work-around for games that try to copy the extensions string to a fixed size buffer and overflow. If a game was released in year X, setting MESA_EXTENSION_MAX_YEAR to that year will likely fix the problem. --- diff --git a/docs/envvars.html b/docs/envvars.html index c8be8437176..986d2f8eb35 100644 --- a/docs/envvars.html +++ b/docs/envvars.html @@ -49,6 +49,15 @@ Setting this variable automatically sets the MESA_TEX_PROG variable as well.
  • MESA_EXTENSION_OVERRIDE - can be used to enable/disable extensions. A value such as "GL_EXT_foo -GL_EXT_bar" will enable the GL_EXT_foo extension and disable the GL_EXT_bar extension. +
  • MESA_EXTENSION_MAX_YEAR - The GL_EXTENSIONS string returned by Mesa is sorted +by extension year. +If this variable is set to year X, only extensions defined on or before year +X will be reported. +This is to work-around a bug in some games where the extension string is +copied into a fixed-size buffer without truncating. +If the extension string is too long, the buffer overrun can cause the game +to crash. +This is a work-around for that.
  • MESA_GLSL - shading language compiler options diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index 4b6e91c4f31..728c73c10ae 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -875,12 +875,24 @@ _mesa_make_extension_string(struct gl_context *ctx) GLboolean *base = (GLboolean *) &ctx->Extensions; const struct extension *i; unsigned j; - + unsigned maxYear = ~0; + + /* Check if the MESA_EXTENSION_MAX_YEAR env var is set */ + { + const char *env = getenv("MESA_EXTENSION_MAX_YEAR"); + if (env) { + maxYear = atoi(env); + _mesa_debug(ctx, "Note: limiting GL extensions to %u or earlier\n", + maxYear); + } + } /* Compute length of the extension string. */ count = 0; for (i = extension_table; i->name != 0; ++i) { - if (base[i->offset] && (i->api_set & (1 << ctx->API))) { + if (base[i->offset] && + i->year <= maxYear && + (i->api_set & (1 << ctx->API))) { length += strlen(i->name) + 1; /* +1 for space */ ++count; } @@ -908,7 +920,9 @@ _mesa_make_extension_string(struct gl_context *ctx) */ j = 0; for (i = extension_table; i->name != 0; ++i) { - if (base[i->offset] && (i->api_set & (1 << ctx->API))) { + if (base[i->offset] && + i->year <= maxYear && + (i->api_set & (1 << ctx->API))) { extension_indices[j++] = i - extension_table; } }