[Mesa-dev] [PATCH] mesa/uniform_query: Don't write to *params if there is an error
Matt Turner
mattst88 at gmail.com
Fri Dec 7 15:23:19 PST 2012
The GL 3.1 and ES 3.0 specs say of glGetActiveUniformsiv:
"If an error occurs, nothing will be written to params."
So save a copy of params and restore it on error. The alternative is
making a pass through the array to check for errors before a second pass
that actually writes *params, but that seems like optimizing bad
programs at the expense of good ones. Actually, this patch sort of does
too.
Fixes es3conform's getactiveuniformsiv_for_nonexistent_uniform_indices
test.
---
src/mesa/main/uniform_query.cpp | 13 +++++++++++--
1 files changed, 11 insertions(+), 2 deletions(-)
Are there security implications of malloc'ing based on uniformCount?
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index cbdd39e..57ddf68 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -84,6 +84,7 @@ _mesa_GetActiveUniformsiv(GLuint program,
GET_CURRENT_CONTEXT(ctx);
struct gl_shader_program *shProg;
GLsizei i;
+ GLint *saved_params;
shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform");
if (!shProg)
@@ -95,13 +96,16 @@ _mesa_GetActiveUniformsiv(GLuint program,
return;
}
+ saved_params = (GLint *) malloc(uniformCount * sizeof(GLint));
+ memcpy(saved_params, params, uniformCount * sizeof(GLint));
+
for (i = 0; i < uniformCount; i++) {
GLuint index = uniformIndices[i];
const struct gl_uniform_storage *uni = &shProg->UniformStorage[index];
if (index >= shProg->NumUserUniformStorage) {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformsiv(index)");
- return;
+ goto error;
}
switch (pname) {
@@ -142,9 +146,14 @@ _mesa_GetActiveUniformsiv(GLuint program,
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glGetActiveUniformsiv(pname)");
- return;
+ goto error;
}
}
+ free(saved_params);
+ return;
+error:
+ memcpy(params, saved_params, uniformCount * sizeof(GLint));
+ free(saved_params);
}
static bool
--
1.7.8.6
More information about the mesa-dev
mailing list