From 5f572ccc95bdfa1445b67511c6d2c9b23bc22208 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 6 Dec 2017 09:35:10 -0800 Subject: [PATCH] spirv: Add better parameter validation for vector and matrix types MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Samuel Iglesias Gonsálvez Reviewed-by: Ian Romanick --- src/compiler/spirv/spirv_to_nir.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 685cbd7e4de..6c61eb423b3 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -934,7 +934,11 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode, struct vtn_type *base = vtn_value(b, w[2], vtn_value_type_type)->type; unsigned elems = w[3]; - vtn_assert(glsl_type_is_scalar(base->type)); + vtn_fail_if(base->base_type != vtn_base_type_scalar, + "Base type for OpTypeVector must be a scalar"); + vtn_fail_if(elems < 2 || elems > 4, + "Invalid component count for OpTypeVector"); + val->type->base_type = vtn_base_type_vector; val->type->type = glsl_vector_type(glsl_get_base_type(base->type), elems); val->type->length = elems; @@ -947,12 +951,18 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode, struct vtn_type *base = vtn_value(b, w[2], vtn_value_type_type)->type; unsigned columns = w[3]; - vtn_assert(glsl_type_is_vector(base->type)); + vtn_fail_if(base->base_type != vtn_base_type_vector, + "Base type for OpTypeMatrix must be a vector"); + vtn_fail_if(columns < 2 || columns > 4, + "Invalid column count for OpTypeMatrix"); + val->type->base_type = vtn_base_type_matrix; val->type->type = glsl_matrix_type(glsl_get_base_type(base->type), glsl_get_vector_elements(base->type), columns); - vtn_assert(!glsl_type_is_error(val->type->type)); + vtn_fail_if(glsl_type_is_error(val->type->type), + "Unsupported base type for OpTypeMatrix"); + assert(!glsl_type_is_error(val->type->type)); val->type->length = columns; val->type->array_element = base; val->type->row_major = false; -- 2.30.2