From c7b2a2fd363f57bb1ab4d7d6bad786af7e2924ef Mon Sep 17 00:00:00 2001 From: Sergii Romantsov Date: Thu, 12 Sep 2019 15:28:45 +0300 Subject: [PATCH] nir/large_constants: more careful data copying A filed of nir_variable.location may be equel to -1. That may cause copying to invalid address of list-node, making some internal fields corrupted. Patch fixes segfault during freeing context due to corrupted address of ralloc_header.destructor. v2: copy data if var is constant (Connor Abbott) CC: Caio Marcelo de Oliveira Filho Fixes: b6d475356846 (nir/large_constants: De-duplicate constants) Signed-off-by: Sergii Romantsov Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111676 Reviewed-by: Connor Abbott --- src/compiler/nir/nir_opt_large_constants.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_opt_large_constants.c b/src/compiler/nir/nir_opt_large_constants.c index fae4ed2..8fd1f0d 100644 --- a/src/compiler/nir/nir_opt_large_constants.c +++ b/src/compiler/nir/nir_opt_large_constants.c @@ -318,7 +318,7 @@ nir_opt_large_constants(nir_shader *shader, shader->constant_data = rzalloc_size(shader, shader->constant_data_size); for (int i = 0; i < num_locals; i++) { struct var_info *info = &var_infos[i]; - if (!info->duplicate) { + if (!info->duplicate && info->is_constant) { memcpy((char *)shader->constant_data + info->var->data.location, info->constant_data, info->constant_data_size); } -- 2.7.4