Mesa (master): i915: Validate API and version in i915CreateContext

Ian Romanick idr at kemper.freedesktop.org
Tue Aug 14 00:45:00 UTC 2012


Module: Mesa
Branch: master
Commit: db273724c9484d513f5caa34729475d2873d9f7b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=db273724c9484d513f5caa34729475d2873d9f7b

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Tue Aug  7 12:30:14 2012 -0700

i915: Validate API and version in i915CreateContext

v2: Use base-10 for versions like gl_context::Version.  Suggested by Ken.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/drivers/dri/i915/i915_context.c  |   34 ++++++++++++++++++++++++++++-
 src/mesa/drivers/dri/i915/i915_context.h  |    3 ++
 src/mesa/drivers/dri/intel/intel_screen.c |    4 +++
 3 files changed, 40 insertions(+), 1 deletions(-)

diff --git a/src/mesa/drivers/dri/i915/i915_context.c b/src/mesa/drivers/dri/i915/i915_context.c
index dc32292..1a0baa2 100644
--- a/src/mesa/drivers/dri/i915/i915_context.c
+++ b/src/mesa/drivers/dri/i915/i915_context.c
@@ -146,6 +146,9 @@ bool
 i915CreateContext(int api,
 		  const struct gl_config * mesaVis,
                   __DRIcontext * driContextPriv,
+                  unsigned major_version,
+                  unsigned minor_version,
+                  unsigned *error,
                   void *sharedContextPrivate)
 {
    struct dd_function_table functions;
@@ -153,8 +156,10 @@ i915CreateContext(int api,
    struct intel_context *intel = &i915->intel;
    struct gl_context *ctx = &intel->ctx;
 
-   if (!i915)
+   if (!i915) {
+      *error = __DRI_CTX_ERROR_NO_MEMORY;
       return false;
+   }
 
    i915InitVtbl(i915);
 
@@ -163,6 +168,33 @@ i915CreateContext(int api,
    if (!intelInitContext(intel, api, mesaVis, driContextPriv,
                          sharedContextPrivate, &functions)) {
       FREE(i915);
+      *error = __DRI_CTX_ERROR_NO_MEMORY;
+      return false;
+   }
+
+   /* Now that the extension bits are known, filter against the requested API
+    * and version.
+    */
+   switch (api) {
+   case API_OPENGL: {
+      const unsigned max_version =
+         (ctx->Extensions.ARB_fragment_shader &&
+          ctx->Extensions.ARB_occlusion_query) ? 20 : 15;
+      const unsigned req_version = major_version * 10 + minor_version;
+
+      if (req_version > max_version) {
+         *error = __DRI_CTX_ERROR_BAD_VERSION;
+         FREE(i915);
+         return false;
+      }
+      break;
+   }
+   case API_OPENGLES:
+   case API_OPENGLES2:
+      break;
+   default:
+      *error = __DRI_CTX_ERROR_BAD_API;
+      FREE(i915);
       return false;
    }
 
diff --git a/src/mesa/drivers/dri/i915/i915_context.h b/src/mesa/drivers/dri/i915/i915_context.h
index 7037465..f5c1596 100644
--- a/src/mesa/drivers/dri/i915/i915_context.h
+++ b/src/mesa/drivers/dri/i915/i915_context.h
@@ -322,6 +322,9 @@ do {									\
 extern bool i915CreateContext(int api,
 			      const struct gl_config * mesaVis,
 			      __DRIcontext * driContextPriv,
+                              unsigned major_version,
+                              unsigned minor_version,
+                              unsigned *error,
 			      void *sharedContextPrivate);
 
 
diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
index 877d11b..737cc49 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.c
+++ b/src/mesa/drivers/dri/intel/intel_screen.c
@@ -693,6 +693,9 @@ extern bool
 i915CreateContext(int api,
 		  const struct gl_config *mesaVis,
 		  __DRIcontext *driContextPriv,
+                  unsigned major_version,
+                  unsigned minor_version,
+                  unsigned *error,
 		  void *sharedContextPrivate);
 extern bool
 brwCreateContext(int api,
@@ -734,6 +737,7 @@ intelCreateContext(gl_api api,
 #ifdef I915
    if (IS_9XX(intelScreen->deviceID)) {
       success = i915CreateContext(api, mesaVis, driContextPriv,
+                                  major_version, minor_version, error,
                                   sharedContextPrivate);
    } else {
       switch (api) {




More information about the mesa-commit mailing list