On 6 October 2016 at 14:12, Emil Velikov <emil.l.veli...@gmail.com> wrote: > From: Emil Velikov <emil.veli...@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.veli...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev