x11_surface_get_formats() is currently assering that the number of elements in pSurfaceFormats must be greater or equal than the number of formats available. This is buggy because later that number of elements is copied from the internal formats' array, so if pSurfaceFormatCount is greater, it will overflow it.
On top of that, this assertion violates the spec. From the Vulkan 1.0 (revision 32, with KHR extensions), page 579 of the PDF: "If pSurfaceFormats is NULL, then the number of format pairs supported for the given surface is returned in pSurfaceFormatCount. Otherwise, pSurfaceFormatCount must point to a variable set by the user to the number of elements in the pSurfaceFormats array, and on return the variable is overwritten with the number of structures actually written to pSurfaceFormats. If the value of pSurfaceFormatCount is less than the number of format pairs supported, at most pSurfaceFormatCount structures will be written. If pSurfaceFormatCount is smaller than the number of format pairs supported for the given surface, VK_INCOMPLETE will be returned instead of VK_SUCCESS to indicate that not all the available values were returned." So, the correct behavior is: If pSurfaceFormatCount is greater than the internal number of formats, then it is clamped to that many formats. But if it is lesser than it, then pSurfaceFormatCount formats are returned, and the call returns VK_INCOMPLETE. --- src/vulkan/wsi/wsi_common_x11.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index b5832c6..548352e 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -394,11 +394,16 @@ x11_surface_get_formats(VkIcdSurfaceBase *surface, return VK_SUCCESS; } - assert(*pSurfaceFormatCount >= ARRAY_SIZE(formats)); + VkResult result = VK_SUCCESS; + + if (*pSurfaceFormatCount > ARRAY_SIZE(formats)) + *pSurfaceFormatCount = ARRAY_SIZE(formats); + else if (*pSurfaceFormatCount < ARRAY_SIZE(formats)) + result = VK_INCOMPLETE; + typed_memcpy(pSurfaceFormats, formats, *pSurfaceFormatCount); - *pSurfaceFormatCount = ARRAY_SIZE(formats); - return VK_SUCCESS; + return result; } static VkResult -- 2.8.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev