[Mesa-dev] [PATCH 5/5] glsl: Avoid buffer overflow when assigning attribute locations
Eduardo Lima Mitev
elima at igalia.com
Wed Mar 11 02:01:28 PDT 2015
From: Iago Toral Quiroga <itoral at igalia.com>
Shaders with excessive number of attributes (>16) can produce a crash
due to buffer overflow in assign_attribute_or_color_locations. The
overflow can happen because we declare a fixed size array that can hold
up to 16 attributes and we don't check that we don't go beyond that
limit.
This patch changes the limit from a fixed size of 16 element to
MAX2(MAX_VERTEX_GENERIC_ATTRIBS, MAX_NV_FRAGMENT_PROGRAM_INPUTS), which
seems more reasonable. It also makes sure that we don't process more than
this amount of attributes, producing a linker error if the shader requires
more than this.
Avoids crashes in 108 dEQP tests in these categories:
dEQP-GLES3.functional.transform_feedback.array_element.separate.
dEQP-GLES3.functional.transform_feedback.array_element.interleaved.*
---
src/glsl/linker.cpp | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 0c44677..ffe8ede 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -1983,9 +1983,11 @@ assign_attribute_or_color_locations(gl_shader_program *prog,
/* Reversed because we want a descending order sort below. */
return r->slots - l->slots;
}
- } to_assign[16];
+ } to_assign[MAX2(MAX_VERTEX_GENERIC_ATTRIBS, MAX_NV_FRAGMENT_PROGRAM_INPUTS)];
unsigned num_attr = 0;
+ unsigned max_attr = (target_index == MESA_SHADER_VERTEX) ?
+ MAX_VERTEX_GENERIC_ATTRIBS : MAX_NV_FRAGMENT_PROGRAM_INPUTS;
foreach_in_list(ir_instruction, node, sh->ir) {
ir_variable *const var = node->as_variable();
@@ -2147,6 +2149,13 @@ assign_attribute_or_color_locations(gl_shader_program *prog,
continue;
}
+ if (num_attr >= max_attr) {
+ linker_error(prog,
+ "Number of required attribute locations "
+ "exceeds allowed limit (limit=%d)", max_attr);
+ return false;
+ }
+
to_assign[num_attr].slots = slots;
to_assign[num_attr].var = var;
num_attr++;
--
2.1.3
More information about the mesa-dev
mailing list