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()