glx: Validate the GLX_RENDER_TYPE value
authorTomasz Lis <tomasz.lis@intel.com>
Thu, 18 Jul 2013 21:19:38 +0000 (14:19 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 18 Jul 2013 23:03:42 +0000 (16:03 -0700)
Correctly handle the value of renderType in GLX context.  In case of the
value being incorrect, context creation fails.

v2 (idr): indirect_create_context is just a memory allocator, so don't
validate the GLX_RENDER_TYPE there.  Fixes regressions in several
GLX_ARB_create_context piglit tests.

Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glx/dri2_glx.c
src/glx/dri_glx.c
src/glx/drisw_glx.c
src/glx/glxclient.h
src/glx/glxcmds.c
src/glx/indirect_glx.c
src/mesa/drivers/x11/fakeglx.c

index 9581bff02dcc739c13455acd4d07bfb07d38ea4b..c54edacab5bdbb4eae798dc938d14437cdba7a55 100644 (file)
@@ -205,6 +205,10 @@ 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 +281,10 @@ dri2_create_context_attribs(struct glx_screen *base,
                                  &api, &reset, 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;
index cc45734b66c1763557fdc9055fd731f329c760e5..faed9d0d16d3ba1022f19308908342cfe8abc5e8 100644 (file)
@@ -581,6 +581,10 @@ 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.
index 2c3e8b5f3ba59f7a7bc2c8154fee7a9bb70f2747..0583cd15ab56d2fb09529aeb310a59ac123c7af9 100644 (file)
@@ -380,6 +380,10 @@ 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 +455,11 @@ drisw_create_context_attribs(struct glx_screen *base,
                                  &api, &reset, 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;
 
index 5b99e093d01f5dac355e54f006b8875716299e8d..81ae792bf743a8b90e027697cb7799c3c6f09ae5 100644 (file)
@@ -803,6 +803,9 @@ 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,
index f6eb07df192cc5f2cfb10df6c9ad2819cfae486d..7c66c9bf82f00a6d6897fd6a0de292d3edcc672b 100644 (file)
@@ -224,6 +224,33 @@ 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)
index 11e92979156cb25f9aa72a3437d79a253f4fe09e..f8944a740066e94497e049fc1337567eb179ace1 100644 (file)
@@ -335,6 +335,10 @@ static const struct glx_context_vtable indirect_context_vtable = {
  * \todo Eliminate \c __glXInitVertexArrayState.  Replace it with a new
  * function called \c __glXAllocateClientState that allocates the memory and
  * does all the initialization (including the pixel pack / unpack).
+ *
+ * \note
+ * This function is \b not the place to validate the context creation
+ * parameters.  It is just the allocator for the \c glx_context.
  */
 _X_HIDDEN struct glx_context *
 indirect_create_context(struct glx_screen *psc,
index 7a2cfbeda7c8cfb32935c382ead8b2eff57e6dde..def157f52df2b48ea2733751c07f28dfbe93d4d2 100644 (file)
@@ -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);