Module: Mesa Branch: main Commit: ffd91ee7a87f588ea9d1f2f6ced4a59bde142cb2 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ffd91ee7a87f588ea9d1f2f6ced4a59bde142cb2
Author: Mike Blumenkrantz <[email protected]> Date: Fri Feb 10 09:36:30 2023 -0500 zink: fix descriptor pool free iterating these arrays are sparsely allocated, and using pop() on them will fail to access some elements Fixes: cf7c17a7af3 ("zink: rework descriptor pool overflow") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21246> --- src/gallium/drivers/zink/zink_descriptors.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c index 68f0ef07fe0..a8782cab657 100644 --- a/src/gallium/drivers/zink/zink_descriptors.c +++ b/src/gallium/drivers/zink/zink_descriptors.c @@ -1406,11 +1406,11 @@ void zink_batch_descriptor_deinit(struct zink_screen *screen, struct zink_batch_state *bs) { for (unsigned i = 0; i < ZINK_DESCRIPTOR_BASE_TYPES; i++) { - while (util_dynarray_contains(&bs->dd.pools[i], struct zink_descriptor_pool_multi *)) { - struct zink_descriptor_pool_multi *mpool = util_dynarray_pop(&bs->dd.pools[i], struct zink_descriptor_pool_multi *); - if (mpool) { - deinit_multi_pool_overflow(screen, mpool); - multi_pool_destroy(screen, mpool); + for (unsigned j = 0; j < bs->dd.pools[i].capacity / sizeof(struct zink_descriptor_pool_multi *); j++) { + struct zink_descriptor_pool_multi **mppool = util_dynarray_element(&bs->dd.pools[i], struct zink_descriptor_pool_multi *, j); + if (mppool && *mppool) { + deinit_multi_pool_overflow(screen, *mppool); + multi_pool_destroy(screen, *mppool); } } util_dynarray_fini(&bs->dd.pools[i]);
