mesa: additional error checking, fix error codes
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c
index c77d0c4..eea44eb 100644
--- a/src/mesa/shader/shader_api.c
+++ b/src/mesa/shader/shader_api.c
@@ -360,6 +360,22 @@
}
+static GLboolean
+_mesa_is_program(GLcontext *ctx, GLuint name)
+{
+ struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name);
+ return shProg ? GL_TRUE : GL_FALSE;
+}
+
+
+static GLboolean
+_mesa_is_shader(GLcontext *ctx, GLuint name)
+{
+ struct gl_shader *shader = _mesa_lookup_shader(ctx, name);
+ return shader ? GL_TRUE : GL_FALSE;
+}
+
+
/**
* Called via ctx->Driver.AttachShader()
*/
@@ -372,12 +388,21 @@
GLuint n;
GLuint i;
- if (!shProg || !sh) {
- _mesa_error(ctx, GL_INVALID_VALUE,
- "glAttachShader(bad program or shader name)");
+ if (!shProg) {
+ GLenum err = _mesa_is_shader(ctx, program)
+ ? GL_INVALID_OPERATION : GL_INVALID_VALUE;
+ _mesa_error(ctx, err, "glAttachShader(bad program or shader name)");
return;
}
+ if (!sh) {
+ GLenum err = _mesa_is_program(ctx, shader)
+ ? GL_INVALID_OPERATION : GL_INVALID_VALUE;
+ _mesa_error(ctx, err, "glAttachShader(bad program or shader name)");
+ return;
+ }
+
+
n = shProg->NumShaders;
for (i = 0; i < n; i++) {
@@ -445,7 +470,9 @@
GLint i, oldIndex;
if (!shProg) {
- _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocation(program)");
+ GLenum err = _mesa_is_shader(ctx, program)
+ ? GL_INVALID_OPERATION : GL_INVALID_VALUE;
+ _mesa_error(ctx, err, "glBindAttribLocation(program)");
return;
}
@@ -458,6 +485,11 @@
return;
}
+ if (index >= ctx->Const.VertexProgram.MaxAttribs) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocation(index)");
+ return;
+ }
+
if (shProg->LinkStatus) {
/* get current index/location for the attribute */
oldIndex = _mesa_get_attrib_location(ctx, program, name);
@@ -946,22 +978,6 @@
}
-static GLboolean
-_mesa_is_program(GLcontext *ctx, GLuint name)
-{
- struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name);
- return shProg ? GL_TRUE : GL_FALSE;
-}
-
-
-static GLboolean
-_mesa_is_shader(GLcontext *ctx, GLuint name)
-{
- struct gl_shader *shader = _mesa_lookup_shader(ctx, name);
- return shader ? GL_TRUE : GL_FALSE;
-}
-
-
/**
* Called via ctx->Driver.ShaderSource()