This patch fix some bugs found by unit tests like passing a wrong
device type all the devices(gpu, cpu and accelarator)
was being created, ignore paramValue if it is NULL and return
invalid_value if paramValueSize != paramValueSizeReturn .
ps: the patch is in annex too.
diff --git a/src/api/api_device.cpp b/src/api/api_device.cpp
index f91ad29..4d6bf19 100644
--- a/src/api/api_device.cpp
+++ b/src/api/api_device.cpp
@@ -73,13 +73,13 @@ clGetDeviceIDs(cl_device_type device_type,
gpu = (device_type & CL_DEVICE_TYPE_DEFAULT) ||
(device_type & CL_DEVICE_TYPE_GPU) ||
- (device_type & CL_DEVICE_TYPE_ALL);
+ !(device_type ^ CL_DEVICE_TYPE_ALL);
cpu = (device_type & CL_DEVICE_TYPE_CPU) ||
- (device_type & CL_DEVICE_TYPE_ALL);
+ !(device_type ^ CL_DEVICE_TYPE_ALL);
accelerator = (device_type & CL_DEVICE_TYPE_ACCELERATOR) ||
- (device_type & CL_DEVICE_TYPE_ALL);
+ !(device_type ^ CL_DEVICE_TYPE_ALL);
if (!gpu && !cpu && !accelerator)
return CL_INVALID_DEVICE_TYPE;
diff --git a/src/core/device.cpp b/src/core/device.cpp
index c300f79..20e6f2b 100644
--- a/src/core/device.cpp
+++ b/src/core/device.cpp
@@ -39,9 +39,12 @@ Device * Device::create(cl_uint type)
static void stringToParam(const std::string &str,
void * paramValue,
+ size_t paramValueSize,
size_t * paramValueSizeRet)
{
- strcpy((char*)paramValue, str.c_str());
+ char *paramCharValue = (char *)paramValue;
+ paramCharValue[paramValueSize - 1] = 0;
+ strncpy(paramCharValue, str.c_str(), paramValueSize - 1);
if (paramValueSizeRet)
*paramValueSizeRet = str.size();
}
@@ -51,8 +54,14 @@ cl_int Device::info(cl_device_info opcode,
void * paramValue,
size_t * paramValueSizeRet) const
{
+ if (!paramValue)
+ return CL_SUCCESS;
+
switch (opcode) {
case CL_DEVICE_TYPE:
+ if (paramValueSizeRet)
+ *paramValueSizeRet = sizeof(type());
+
((cl_int*)paramValue)[0] = type();
break;
case CL_DEVICE_VENDOR_ID:
@@ -140,10 +149,10 @@ cl_int Device::info(cl_device_info opcode,
case CL_DEVICE_QUEUE_PROPERTIES:
break;
case CL_DEVICE_NAME:
- stringToParam(m_info.name, paramValue, paramValueSizeRet);
+ stringToParam(m_info.name, paramValue, paramValueSize,
paramValueSizeRet);
break;
case CL_DEVICE_VENDOR:
- stringToParam(m_info.name, paramValue, paramValueSizeRet);
+ stringToParam(m_info.name, paramValue, paramValueSize,
paramValueSizeRet);
break;
case CL_DRIVER_VERSION:
break;
@@ -159,6 +168,9 @@ cl_int Device::info(cl_device_info opcode,
break;
}
+ if (paramValueSizeRet && paramValueSize != *paramValueSizeRet)
+ return CL_INVALID_VALUE;
+
return CL_SUCCESS;
}
diff --git a/src/api/api_device.cpp b/src/api/api_device.cpp
index f91ad29..4d6bf19 100644
--- a/src/api/api_device.cpp
+++ b/src/api/api_device.cpp
@@ -73,13 +73,13 @@ clGetDeviceIDs(cl_device_type device_type,
gpu = (device_type & CL_DEVICE_TYPE_DEFAULT) ||
(device_type & CL_DEVICE_TYPE_GPU) ||
- (device_type & CL_DEVICE_TYPE_ALL);
+ !(device_type ^ CL_DEVICE_TYPE_ALL);
cpu = (device_type & CL_DEVICE_TYPE_CPU) ||
- (device_type & CL_DEVICE_TYPE_ALL);
+ !(device_type ^ CL_DEVICE_TYPE_ALL);
accelerator = (device_type & CL_DEVICE_TYPE_ACCELERATOR) ||
- (device_type & CL_DEVICE_TYPE_ALL);
+ !(device_type ^ CL_DEVICE_TYPE_ALL);
if (!gpu && !cpu && !accelerator)
return CL_INVALID_DEVICE_TYPE;
diff --git a/src/core/device.cpp b/src/core/device.cpp
index c300f79..20e6f2b 100644
--- a/src/core/device.cpp
+++ b/src/core/device.cpp
@@ -39,9 +39,12 @@ Device * Device::create(cl_uint type)
static void stringToParam(const std::string &str,
void * paramValue,
+ size_t paramValueSize,
size_t * paramValueSizeRet)
{
- strcpy((char*)paramValue, str.c_str());
+ char *paramCharValue = (char *)paramValue;
+ paramCharValue[paramValueSize - 1] = 0;
+ strncpy(paramCharValue, str.c_str(), paramValueSize - 1);
if (paramValueSizeRet)
*paramValueSizeRet = str.size();
}
@@ -51,8 +54,14 @@ cl_int Device::info(cl_device_info opcode,
void * paramValue,
size_t * paramValueSizeRet) const
{
+ if (!paramValue)
+ return CL_SUCCESS;
+
switch (opcode) {
case CL_DEVICE_TYPE:
+ if (paramValueSizeRet)
+ *paramValueSizeRet = sizeof(type());
+
((cl_int*)paramValue)[0] = type();
break;
case CL_DEVICE_VENDOR_ID:
@@ -140,10 +149,10 @@ cl_int Device::info(cl_device_info opcode,
case CL_DEVICE_QUEUE_PROPERTIES:
break;
case CL_DEVICE_NAME:
- stringToParam(m_info.name, paramValue, paramValueSizeRet);
+ stringToParam(m_info.name, paramValue, paramValueSize, paramValueSizeRet);
break;
case CL_DEVICE_VENDOR:
- stringToParam(m_info.name, paramValue, paramValueSizeRet);
+ stringToParam(m_info.name, paramValue, paramValueSize, paramValueSizeRet);
break;
case CL_DRIVER_VERSION:
break;
@@ -159,6 +168,9 @@ cl_int Device::info(cl_device_info opcode,
break;
}
+ if (paramValueSizeRet && paramValueSize != *paramValueSizeRet)
+ return CL_INVALID_VALUE;
+
return CL_SUCCESS;
}
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev