[Mesa-dev] [PATCH] anv: fix enumeration of properties
Emil Velikov
emil.l.velikov at gmail.com
Fri Oct 14 10:23:37 UTC 2016
On 6 October 2016 at 14:12, Emil Velikov <emil.l.velikov at gmail.com> wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
>
> Driver should enumerate only up-to min2(num_available, num_requested)
> properties and return VK_INCOMPLETE if the # of requested props is
> smaller than the ones available.
>
> Presently we assert out in such cases.
>
> Inspired by a similar fix for RADV.
>
> Should fix: dEQP-VK.api.info.device.extensions
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
> src/intel/vulkan/anv_device.c | 20 ++++++++++++++------
> 1 file changed, 14 insertions(+), 6 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
> index c7b9979..497bf9f 100644
> --- a/src/intel/vulkan/anv_device.c
> +++ b/src/intel/vulkan/anv_device.c
> @@ -1003,15 +1003,19 @@ VkResult anv_EnumerateInstanceExtensionProperties(
> uint32_t* pPropertyCount,
> VkExtensionProperties* pProperties)
> {
> + unsigned i;
> +
> if (pProperties == NULL) {
> *pPropertyCount = ARRAY_SIZE(global_extensions);
> return VK_SUCCESS;
> }
>
> - assert(*pPropertyCount >= ARRAY_SIZE(global_extensions));
> + for (i = 0; i < MIN2(*pPropertyCount, ARRAY_SIZE(global_extensions)); i++)
> + memcpy(&pProperties[i], &global_extensions[i], sizeof(VkExtensionProperties));
>
> - *pPropertyCount = ARRAY_SIZE(global_extensions);
> - memcpy(pProperties, global_extensions, sizeof(global_extensions));
> + *pPropertyCount = i;
> + if (i < ARRAY_SIZE(global_extensions))
> + return VK_INCOMPLETE;
>
> return VK_SUCCESS;
> }
> @@ -1022,15 +1026,19 @@ VkResult anv_EnumerateDeviceExtensionProperties(
> uint32_t* pPropertyCount,
> VkExtensionProperties* pProperties)
> {
> + unsigned i;
> +
> if (pProperties == NULL) {
> *pPropertyCount = ARRAY_SIZE(device_extensions);
> return VK_SUCCESS;
> }
>
> - assert(*pPropertyCount >= ARRAY_SIZE(device_extensions));
> + for (i = 0; i < MIN2(*pPropertyCount, ARRAY_SIZE(device_extensions)); i++)
> + memcpy(&pProperties[i], &device_extensions[i], sizeof(VkExtensionProperties));
>
> - *pPropertyCount = ARRAY_SIZE(device_extensions);
> - memcpy(pProperties, device_extensions, sizeof(device_extensions));
> + *pPropertyCount = i;
> + if (i < ARRAY_SIZE(device_extensions))
> + return VK_INCOMPLETE;
>
> return VK_SUCCESS;
> }
> --
Humble ping anyone ?
Note: the equivalent RADV patch does not use MIN2, thus it can cause
information leak when pPropertyCount > ARRAY_SIZE(device_extensions).
-Emil
More information about the mesa-dev
mailing list