From 7a820ebf3f97eb3e3f090699cbc4f9542d52faad Mon Sep 17 00:00:00 2001 From: Roman Kiryanov Date: Wed, 24 Apr 2019 17:51:13 -0700 Subject: Fix vk_append_struct to add elements after the last one This also limits list's length to some random number to crash if the struct chain has a loop. Bug: 131181334 Test: make Change-Id: I265b0c69e528154917f031799b37014502fd4ec3 Merged-In: I5ae17ce129aba820b98f999208802c9135cbd8b8 Signed-off-by: Roman Kiryanov --- system/vulkan_enc/vk_util.h | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/system/vulkan_enc/vk_util.h b/system/vulkan_enc/vk_util.h index 0c7f4b98..da394f4e 100644 --- a/system/vulkan_enc/vk_util.h +++ b/system/vulkan_enc/vk_util.h @@ -26,6 +26,7 @@ /* common inlines and macros for vulkan drivers */ #include +#include struct vk_struct_common { VkStructureType sType; @@ -214,12 +215,29 @@ vk_init_struct_chain(vk_struct_common* start) return start; } +static inline vk_struct_common* +vk_last_struct_chain(vk_struct_common* i) +{ + for (int n = 1000000; n > 0; --n) { + vk_struct_common* next = i->pNext; + if (next) { + i = next; + } else { + return i; + } + } + + ::abort(); // crash on loops in the chain + return NULL; +} + static inline vk_struct_common* vk_append_struct(vk_struct_common* current, vk_struct_common* next) { - current->pNext = next; - next->pNext = nullptr; - return next; + vk_struct_common* last = vk_last_struct_chain(current); + last->pNext = next; + next->pNext = nullptr; + return current; } #endif /* VK_UTIL_H */ -- cgit v1.2.3