summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2011-09-15 09:06:19 -0600
committerBrian Paul <[email protected]>2011-09-15 09:39:13 -0600
commit6fd6efa7bf90b0c85f69f2e989a273f82f381e3b (patch)
tree6d9da3ac43f73f0104ebfb98b3e6c3c0e1d79568 /src
parentb0524e49fc555ec8e5505e88c03e1993cdf3666b (diff)
mesa: fix error handling for dlist image unpacking
When compiling glDrawPixels, glTexImage(), etc. and we're copying the user's image we need to be careful about GL error checking. Previously, we were incorrectly generating GL_OUT_OF_MEMORY in unpack_image() if width <= 0 or height <= 0 or for invalid format/type values. We now check those arguments in unpack_image() and return NULL if there's a bad value. The command will get compiled with the arguments as-is and image=NULL. Later, when the command is executed the correct errors will be generated. This issue was reported by Yuanhan Liu <[email protected]> Reviewed-by: Yuanhan Liu <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/main/dlist.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c
index 6e075b4e54b..2b2ff9015cb 100644
--- a/src/mesa/main/dlist.c
+++ b/src/mesa/main/dlist.c
@@ -871,7 +871,11 @@ translate_id(GLsizei n, GLenum type, const GLvoid * list)
/**
* Wrapper for _mesa_unpack_image() that handles pixel buffer objects.
- * If we run out of memory, GL_OUT_OF_MEMORY will be recorded.
+ * If width < 0 or height < 0 or format or type are invalid we'll just
+ * return NULL. We will not generate an error since OpenGL command
+ * arguments aren't error-checked until the command is actually executed
+ * (not when they're compiled).
+ * But if we run out of memory, GL_OUT_OF_MEMORY will be recorded.
*/
static GLvoid *
unpack_image(struct gl_context *ctx, GLuint dimensions,
@@ -879,6 +883,15 @@ unpack_image(struct gl_context *ctx, GLuint dimensions,
GLenum format, GLenum type, const GLvoid * pixels,
const struct gl_pixelstore_attrib *unpack)
{
+ if (width <= 0 || height <= 0) {
+ return NULL;
+ }
+
+ if (_mesa_bytes_per_pixel(format, type) <= 0) {
+ /* bad format and/or type */
+ return NULL;
+ }
+
if (!_mesa_is_bufferobj(unpack->BufferObj)) {
/* no PBO */
GLvoid *image = _mesa_unpack_image(dimensions, width, height, depth,