Open
Description
Validation of ur_mem_type_t
, which is extended by the experimental bindless images feature, does not correctly validate the extended enumeration UR_MEM_TYPE_IMAGE_CUBEMAP_EXP
.
if (pImageDesc && UR_MEM_TYPE_IMAGE1D_ARRAY < pImageDesc->type) {
return UR_RESULT_ERROR_INVALID_IMAGE_FORMAT_DESCRIPTOR;
}
typedef enum ur_mem_type_t {
UR_MEM_TYPE_IMAGE2D = 0, ///< 2D image object
UR_MEM_TYPE_IMAGE3D = 1, ///< 3D image object
UR_MEM_TYPE_IMAGE2D_ARRAY = 2, ///< 2D image array object
UR_MEM_TYPE_IMAGE1D = 3, ///< 1D image object
UR_MEM_TYPE_IMAGE1D_ARRAY = 4, ///< 1D image array object
UR_MEM_TYPE_IMAGE_CUBEMAP_EXP = 0x2000, ///< Experimental cubemap image object
/// @cond
UR_MEM_TYPE_FORCE_UINT32 = 0x7fffffff
/// @endcond
} ur_mem_type_t;
This results in valid usage of the bindless images entry points which take a ur_mem_type_t
returning the UR_RESULT_ERROR_INVALID_IMAGE_FORMAT_DESCRIPTOR
erroneously.
Given the gap in valid values, validation should instead look like this:
if (pImageDesc) {
switch (pImageDesc->type) {
case UR_MEM_TYPE_IMAGE2D:
case UR_MEM_TYPE_IMAGE3D:
case UR_MEM_TYPE_IMAGE2D_ARRAY:
case UR_MEM_TYPE_IMAGE1D:
case UR_MEM_TYPE_IMAGE1D_ARRAY:
case UR_MEM_TYPE_IMAGE2D:
case UR_MEM_TYPE_IMAGE_CUBEMAP_EXP:
break;
default:
return UR_RESULT_ERROR_INVALID_IMAGE_FORMAT_DESCRIPTOR;
}
}