glx: Verification of the RENDER_TYPE value. The change is to correctly handle the value of renderType in GLX context. In case of the value being incorrect, context creation fails. --- src/glx/dri2_glx.c | 9 +++++++++ src/glx/dri_glx.c | 5 +++++ src/glx/drisw_glx.c | 10 ++++++++++ src/glx/glxclient.h | 2 ++ src/glx/glxcmds.c | 24 ++++++++++++++++++++++++ src/glx/indirect_glx.c | 5 +++++ src/mesa/drivers/x11/fakeglx.c | 5 ++++- 7 files changed, 59 insertions(+), 1 deletion(-)
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index d60c675..bf11b25 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -205,6 +205,11 @@ dri2_create_context(struct glx_screen *base, __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; __DRIcontext *shared = NULL; + /* Check the renderType value */ + if (!validate_renderType_against_config(config_base, renderType)) { + return NULL; + } + if (shareList) { /* If the shareList context is not a DRI2 context, we cannot possibly * create a DRI2 context that shares it. @@ -277,6 +282,10 @@ dri2_create_context_attribs(struct glx_screen *base, error)) goto error_exit; + /* Check the renderType value */ + if (!validate_renderType_against_config(config_base, renderType)) + goto error_exit; + if (shareList) { pcp_shared = (struct dri2_context *) shareList; shared = pcp_shared->driContext; diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c index cc45734..63eb884 100644 --- a/src/glx/dri_glx.c +++ b/src/glx/dri_glx.c @@ -581,6 +581,11 @@ dri_create_context(struct glx_screen *base, if (!psc->base.driScreen) return NULL; + /* Check the renderType value */ + if (!validate_renderType_against_config(config_base, renderType)) { + return NULL; + } + if (shareList) { /* If the shareList context is not a DRI context, we cannot possibly * create a DRI context that shares it. diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index ef0e52b..335140c 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -380,6 +380,11 @@ drisw_create_context(struct glx_screen *base, if (!psc->base.driScreen) return NULL; + /* Check the renderType value */ + if (!validate_renderType_against_config(config_base, renderType)) { + return NULL; + } + if (shareList) { /* If the shareList context is not a DRISW context, we cannot possibly * create a DRISW context that shares it. @@ -451,6 +456,11 @@ drisw_create_context_attribs(struct glx_screen *base, error)) return NULL; + /* Check the renderType value */ + if (!validate_renderType_against_config(config_base, renderType)) { + return NULL; + } + if (reset != __DRI_CTX_RESET_NO_NOTIFICATION) return NULL; diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index fc8f31c..7e5db0a 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -803,6 +803,8 @@ extern int applegl_create_display(struct glx_display *display); #endif +extern Bool validate_renderType_against_config(const struct glx_config *config, int renderType); + extern struct glx_drawable *GetGLXDrawable(Display *dpy, GLXDrawable drawable); extern int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw, diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index 80977c8..502295f 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -224,6 +224,30 @@ ValidateGLXFBConfig(Display * dpy, GLXFBConfig fbconfig) return NULL; } +/** + * Verifies context's GLX_RENDER_TYPE value with config. + * \param config GLX FBConfig which will support the returned renderType. + * \param renderType The context render type to be verified. + * \return True if the value of context renderType was approved, or 0 if no valid value was found. + */ +Bool +validate_renderType_against_config(const struct glx_config *config, int renderType) +{ + switch (renderType) { + case GLX_RGBA_TYPE: + return (config->renderType & GLX_RGBA_BIT) != 0; + case GLX_COLOR_INDEX_TYPE: + return (config->renderType & GLX_COLOR_INDEX_BIT) != 0; + case GLX_RGBA_FLOAT_TYPE_ARB: + return (config->renderType & GLX_RGBA_FLOAT_BIT_ARB) != 0; + case GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT: + return (config->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) != 0; + default: + break; + } + return 0; +} + _X_HIDDEN Bool glx_context_init(struct glx_context *gc, struct glx_screen *psc, struct glx_config *config) diff --git a/src/glx/indirect_glx.c b/src/glx/indirect_glx.c index 47e514d..b42bc55 100644 --- a/src/glx/indirect_glx.c +++ b/src/glx/indirect_glx.c @@ -352,6 +352,11 @@ indirect_create_context(struct glx_screen *psc, return NULL; } + /* Check the renderType value */ + if (!validate_renderType_against_config(mode, renderType)) { + return NULL; + } + /* Allocate our context record */ gc = calloc(1, sizeof *gc); if (!gc) { diff --git a/src/mesa/drivers/x11/fakeglx.c b/src/mesa/drivers/x11/fakeglx.c index 7a2cfbe..c48fc40 100644 --- a/src/mesa/drivers/x11/fakeglx.c +++ b/src/mesa/drivers/x11/fakeglx.c @@ -2325,7 +2325,10 @@ Fake_glXCreateNewContext( Display *dpy, GLXFBConfig config, XMesaVisual xmvis = (XMesaVisual) config; if (!dpy || !config || - (renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE)) + (renderType != GLX_RGBA_TYPE && + renderType != GLX_COLOR_INDEX_TYPE && + renderType != GLX_RGBA_FLOAT_TYPE_ARB && + renderType != GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT)) return 0; glxCtx = CALLOC_STRUCT(fake_glx_context); -- 1.7.9.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev