nir/inline_uniforms: fix oob access with nir_find_inlinable_uniforms
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 5 Sep 2023 16:37:29 +0000 (12:37 -0400)
committerMarge Bot <emma+marge@anholt.net>
Sat, 9 Sep 2023 16:40:46 +0000 (16:40 +0000)
the array dimensionality needs to match nir_add_inlinable_uniforms even if
only the first member is used

Fixes: 0c0fb216dd6 ("nir/inline_uniforms: Allow possibility of more than one UBO")

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25063>

src/compiler/nir/nir_inline_uniforms.c

index f17972e..64e1269 100644 (file)
@@ -366,19 +366,19 @@ void
 nir_find_inlinable_uniforms(nir_shader *shader)
 {
    uint32_t uni_offsets[MAX_INLINABLE_UNIFORMS];
-   uint8_t num_offsets = 0;
+   uint8_t num_offsets[MAX_NUM_BO] = {0};
 
    nir_foreach_function_impl(impl, shader) {
       nir_metadata_require(impl, nir_metadata_loop_analysis,
                            nir_var_all, false);
 
       foreach_list_typed(nir_cf_node, node, node, &impl->body)
-         process_node(node, NULL, uni_offsets, &num_offsets);
+         process_node(node, NULL, uni_offsets, num_offsets);
    }
 
-   for (int i = 0; i < num_offsets; i++)
+   for (int i = 0; i < num_offsets[0]; i++)
       shader->info.inlinable_uniform_dw_offsets[i] = uni_offsets[i] / 4;
-   shader->info.num_inlinable_uniforms = num_offsets;
+   shader->info.num_inlinable_uniforms = num_offsets[0];
 }
 
 void