draw: do bounds checking of array elements (debug only)
authorBrian Paul <brianp@vmware.com>
Thu, 29 Jul 2010 23:24:20 +0000 (17:24 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 29 Jul 2010 23:25:54 +0000 (17:25 -0600)
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.

src/gallium/auxiliary/draw/draw_pipe.c

index 8cd75ecf9a36b12be06fcd69e36a557694476d3e..144f10a5d0537a2ac8ef3803bd0d02a1c8355393 100644 (file)
@@ -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,