From ef29f3758e6ac0d6cdd3ccb5ba853f4605c83c39 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Fri, 21 Aug 2020 16:35:28 +0300 Subject: [PATCH] nir/large_constants: Eliminate out-of-bounds writes to large constants Out-of-bounds writes could be eliminated per spec: Section 5.11 (Out-of-Bounds Accesses) of the GLSL 4.60 spec says: "In the subsections described above for array, vector, matrix and structure accesses, any out-of-bounds access produced undefined behavior.... Out-of-bounds writes may be discarded or overwrite other variables of the active program." Fixes: 1235850522cd5e7b07701f7065996430ca1514b6 Signed-off-by: Danylo Piliaiev Reviewed-by: Eric Anholt Part-of: (cherry picked from commit 0ba82f78a57d352c1042678962e8a386b411322f) --- .pick_status.json | 2 +- src/compiler/nir/nir_opt_large_constants.c | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index b79a1c47583..922903d7e9f 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -427,7 +427,7 @@ "description": "nir/large_constants: Eliminate out-of-bounds writes to large constants", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "1235850522cd5e7b07701f7065996430ca1514b6" }, diff --git a/src/compiler/nir/nir_opt_large_constants.c b/src/compiler/nir/nir_opt_large_constants.c index 7ed26f51127..23b30693ee5 100644 --- a/src/compiler/nir/nir_opt_large_constants.c +++ b/src/compiler/nir/nir_opt_large_constants.c @@ -118,8 +118,11 @@ handle_constant_store(void *mem_ctx, struct var_info *info, info->constant_data = rzalloc_size(mem_ctx, var_size); } - char *dst = (char *)info->constant_data + - nir_deref_instr_get_const_offset(deref, size_align); + const unsigned offset = nir_deref_instr_get_const_offset(deref, size_align); + if (offset >= info->constant_data_size) + return; + + char *dst = (char *)info->constant_data + offset; for (unsigned i = 0; i < num_components; i++) { if (!(writemask & (1 << i)))