From: José Fonseca <jfons...@vmware.com> As suggested by Brian Paul.
Tested with piglit glx-create-context-invalid-{gl,es}-version. --- src/gallium/state_trackers/glx/xlib/glx_api.c | 13 +++------- src/gallium/state_trackers/wgl/stw_ext_context.c | 13 +++------- src/mesa/main/version.c | 33 ++++++++++++++++++++++++ src/mesa/main/version.h | 6 +++++ 4 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/gallium/state_trackers/glx/xlib/glx_api.c b/src/gallium/state_trackers/glx/xlib/glx_api.c index 1807edb..d4e028c 100644 --- a/src/gallium/state_trackers/glx/xlib/glx_api.c +++ b/src/gallium/state_trackers/glx/xlib/glx_api.c @@ -36,6 +36,8 @@ #include <X11/Xmd.h> #include <GL/glxproto.h> +#include "main/version.h" + #include "xm_api.h" @@ -2792,19 +2794,12 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config, if (majorVersion <= 0 || minorVersion < 0 || (profileMask != GLX_CONTEXT_ES_PROFILE_BIT_EXT && - ((majorVersion == 1 && minorVersion > 5) || - (majorVersion == 2 && minorVersion > 1) || - (majorVersion == 3 && minorVersion > 3) || - (majorVersion == 4 && minorVersion > 5) || - majorVersion > 4))) { + !_mesa_is_valid_version(majorVersion, minorVersion))) { generate_error(dpy, BadMatch, 0, X_GLXCreateContextAtrribsARB, True); return NULL; } if (profileMask == GLX_CONTEXT_ES_PROFILE_BIT_EXT && - ((majorVersion == 1 && minorVersion > 1) || - (majorVersion == 2 && minorVersion > 0) || - (majorVersion == 3 && minorVersion > 1) || - majorVersion > 3)) { + !_mesa_is_valid_es_version(majorVersion, minorVersion)) { /* GLX_EXT_create_context_es2_profile says nothing to justifying a * different error code for invalid ES versions, but this is what NVIDIA * does and piglit expects. diff --git a/src/gallium/state_trackers/wgl/stw_ext_context.c b/src/gallium/state_trackers/wgl/stw_ext_context.c index 8a96cac..ee46334 100644 --- a/src/gallium/state_trackers/wgl/stw_ext_context.c +++ b/src/gallium/state_trackers/wgl/stw_ext_context.c @@ -30,6 +30,8 @@ #include <GL/gl.h> #include <GL/wglext.h> +#include "main/version.h" + #include "stw_icd.h" #include "stw_context.h" #include "stw_device.h" @@ -114,16 +116,9 @@ wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList) if (majorVersion <= 0 || minorVersion < 0 || (profileMask != WGL_CONTEXT_ES_PROFILE_BIT_EXT && - ((majorVersion == 1 && minorVersion > 5) || - (majorVersion == 2 && minorVersion > 1) || - (majorVersion == 3 && minorVersion > 3) || - (majorVersion == 4 && minorVersion > 5) || - majorVersion > 4)) || + !_mesa_is_valid_version(majorVersion, minorVersion)) || (profileMask == WGL_CONTEXT_ES_PROFILE_BIT_EXT && - ((majorVersion == 1 && minorVersion > 1) || - (majorVersion == 2 && minorVersion > 0) || - (majorVersion == 3 && minorVersion > 1) || - majorVersion > 3))) { + !_mesa_is_valid_es_version(majorVersion, minorVersion))) { SetLastError(ERROR_INVALID_VERSION_ARB); return NULL; } diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c index 4951891..5bdef16 100644 --- a/src/mesa/main/version.c +++ b/src/mesa/main/version.c @@ -460,3 +460,36 @@ _mesa_compute_version(struct gl_context *ctx) break; } } + + +GLboolean +_mesa_is_valid_version(int major, int minor) +{ + static const char max_minor_version[] = { + /* 1 . */ 5, + /* 2 . */ 1, + /* 3 . */ 3, + /* 4 . */ 5, + }; + + return (major >= 0 && + major < sizeof max_minor_version && + minor >= 0 && + minor <= max_minor_version[major - 1]); +} + + +GLboolean +_mesa_is_valid_es_version(int major, int minor) +{ + static const char max_minor_version[] = { + /* 1 . */ 1, + /* 2 . */ 0, + /* 3 . */ 1, + }; + + return (major >= 0 && + major < sizeof max_minor_version && + minor >= 0 && + minor <= max_minor_version[major - 1]); +} diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h index 450a0e3..e2e1fc2 100644 --- a/src/mesa/main/version.h +++ b/src/mesa/main/version.h @@ -50,4 +50,10 @@ _mesa_override_glsl_version(struct gl_constants *consts); extern int _mesa_get_gl_version_override(void); +extern GLboolean +_mesa_is_valid_version(int major, int minor); + +extern GLboolean +_mesa_is_valid_es_version(int major, int minor); + #endif /* VERSION_H */ -- 2.1.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev