diff options
author | Brian Paul <[email protected]> | 2010-07-29 17:24:20 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2010-07-29 17:25:54 -0600 |
commit | b4c8de1ff24d4d5e2fe550da54249934320acab4 (patch) | |
tree | 56b47cc876ab507d685277c12fd78fdf91107ac6 /src/gallium/auxiliary | |
parent | d88b6e19c14900f4cad94cf7a28d159369463108 (diff) |
draw: do bounds checking of array elements (debug only)
Make sure that all the element indexes actually lie inside the vertex
buffer.
Also, rename pipe_run() to pipe_run_elts() to be more specific.
And assert/check the vertex count for the non-indexed case.
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pipe.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pipe.c b/src/gallium/auxiliary/draw/draw_pipe.c index 8cd75ecf9a3..144f10a5d05 100644 --- a/src/gallium/auxiliary/draw/draw_pipe.c +++ b/src/gallium/auxiliary/draw/draw_pipe.c @@ -220,7 +220,7 @@ static void do_triangle( struct draw_context *draw, do_point( draw, \ verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK) ) -#define FUNC pipe_run +#define FUNC pipe_run_elts #define ARGS \ struct draw_context *draw, \ unsigned prim, \ @@ -269,14 +269,29 @@ void draw_pipeline_run( struct draw_context *draw, i < prim_info->primitive_count; start += prim_info->primitive_lengths[i], i++) { - unsigned count = prim_info->primitive_lengths[i]; - - pipe_run(draw, - prim_info->prim, - vert_info->verts, - vert_info->stride, - prim_info->elts + start, - count); + const unsigned count = prim_info->primitive_lengths[i]; + +#if DEBUG + /* make sure none of the element indexes go outside the vertex buffer */ + { + unsigned max_index = 0x0, i; + /* find the largest element index */ + for (i = 0; i < count; i++) { + unsigned int index = (prim_info->elts[start + i] + & ~DRAW_PIPE_FLAG_MASK); + if (index > max_index) + max_index = index; + } + assert(max_index <= vert_info->count); + } +#endif + + pipe_run_elts(draw, + prim_info->prim, + vert_info->verts, + vert_info->stride, + prim_info->elts + start, + count); } draw->pipeline.verts = NULL; @@ -378,6 +393,8 @@ void draw_pipeline_run_linear( struct draw_context *draw, draw->pipeline.vertex_stride = vert_info->stride; draw->pipeline.vertex_count = count; + assert(count <= vert_info->count); + pipe_run_linear(draw, prim_info->prim, (struct vertex_header*)verts, |