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@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user