[Mesa-dev] [PATCH] draw: avoid buffer overflows with bad geometry programs.

Dave Airlie airlied at gmail.com
Tue Jun 10 17:27:58 PDT 2014


From: Dave Airlie <airlied at redhat.com>

One of the mismatched tests have a max output vertices of 3,
but emits 6 vertices, this means the output buffer is undersized
and causes problems down the line, so limit things later if we
have a number of vertices lower than the number required to execute
a primitive.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/gallium/auxiliary/draw/draw_gs.c      | 4 ++--
 src/gallium/auxiliary/draw/draw_pt_emit.c | 8 +++++++-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c
index fc4f697..d07e88f 100644
--- a/src/gallium/auxiliary/draw/draw_gs.c
+++ b/src/gallium/auxiliary/draw/draw_gs.c
@@ -92,8 +92,8 @@ tgsi_fetch_gs_outputs(struct draw_geometry_shader *shader,
       unsigned num_verts_per_prim = machine->Primitives[prim_idx];
       shader->primitive_lengths[prim_idx +   shader->emitted_primitives] =
          machine->Primitives[prim_idx];
-      shader->emitted_vertices += num_verts_per_prim;
-      for (j = 0; j < num_verts_per_prim; j++, current_idx++) {
+      shader->emitted_vertices += MIN2(num_verts_per_prim, shader->max_output_vertices);
+      for (j = 0; j < MIN2(num_verts_per_prim, shader->max_output_vertices); j++, current_idx++) {
          int idx = current_idx * shader->info.num_outputs;
 #ifdef DEBUG_OUTPUTS
          debug_printf("%d) Output vert:\n", idx / shader->info.num_outputs);
diff --git a/src/gallium/auxiliary/draw/draw_pt_emit.c b/src/gallium/auxiliary/draw/draw_pt_emit.c
index 011efe7..d8e2809 100644
--- a/src/gallium/auxiliary/draw/draw_pt_emit.c
+++ b/src/gallium/auxiliary/draw/draw_pt_emit.c
@@ -26,6 +26,7 @@
  **************************************************************************/
 
 #include "util/u_memory.h"
+#include "util/u_math.h"
 #include "draw/draw_context.h"
 #include "draw/draw_private.h"
 #include "draw/draw_vbuf.h"
@@ -255,9 +256,14 @@ draw_pt_emit_linear(struct pt_emit *emit,
         i < prim_info->primitive_count;
         start += prim_info->primitive_lengths[i], i++)
    {
+      int len;
+      if (start > count)
+         continue;
+      len = MIN2(prim_info->primitive_lengths[i], count);
       render->draw_arrays(render,
                           start,
-                          prim_info->primitive_lengths[i]);
+                          len);
+
    }
    
    render->release_vertices(render);
-- 
1.9.3



More information about the mesa-dev mailing list