nir/serialize: Alloc constants off the variable
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 24 Jul 2018 18:01:20 +0000 (11:01 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 24 Jul 2018 19:34:07 +0000 (12:34 -0700)
nir_sweep assumes that constants area always allocated off the variable
to which they belong.  Violating this assumption causes them to get
freed early and leads to use-after-free bugs.

Fixes: 120da00975541 "nir: add serialization and deserialization"
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107366
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Tested-by: Mark Janes <mark.a.janes@intel.com>
src/compiler/nir/nir_serialize.c

index 6a30738c2d764751f1fbb6a0648a27df922636d2..43016310048097b004bf211442fd77d231468737 100644 (file)
@@ -124,7 +124,7 @@ read_constant(read_ctx *ctx, nir_variable *nvar)
 
    blob_copy_bytes(ctx->blob, (uint8_t *)c->values, sizeof(c->values));
    c->num_elements = blob_read_uint32(ctx->blob);
-   c->elements = ralloc_array(ctx->nir, nir_constant *, c->num_elements);
+   c->elements = ralloc_array(nvar, nir_constant *, c->num_elements);
    for (unsigned i = 0; i < c->num_elements; i++)
       c->elements[i] = read_constant(ctx, nvar);