Runtime: fixed the region check for three rect region related APIs.
authorZhigang Gong <zhigang.gong@intel.com>
Tue, 3 Dec 2013 07:26:46 +0000 (15:26 +0800)
committerZhigang Gong <zhigang.gong@intel.com>
Wed, 11 Dec 2013 01:57:33 +0000 (09:57 +0800)
Signed-off-by: Zhigang Gong <zhigang.gong@intel.com>
Reviewed-by: "Yang, Rong R" <rong.r.yang@intel.com>
src/cl_api.c

index 54701aa..1f720c7 100644 (file)
@@ -1432,7 +1432,9 @@ clEnqueueReadBufferRect(cl_command_queue command_queue,
     goto error;
   }
 
-  if ((buffer_origin[2]+region[2])*buffer_slice_pitch + (buffer_origin[1]+region[1])*buffer_row_pitch + buffer_origin[0] + region[0] > buffer->size) {
+  if ((buffer_origin[2] + region[2] - 1) * buffer_slice_pitch
+         + (buffer_origin[1] + region[1] - 1) * buffer_row_pitch
+         + buffer_origin[0] + region[0] > buffer->size) {
     err = CL_INVALID_VALUE;
     goto error;
   }
@@ -1565,7 +1567,9 @@ clEnqueueWriteBufferRect(cl_command_queue     command_queue,
     goto error;
   }
 
-  if ((buffer_origin[2]+region[2])*buffer_slice_pitch + (buffer_origin[1]+region[1])*buffer_row_pitch + buffer_origin[0] + region[0] > buffer->size) {
+  if ((buffer_origin[2] + region[2] - 1) * buffer_slice_pitch
+         + (buffer_origin[1] + region[1] - 1) * buffer_row_pitch
+         + buffer_origin[0] + region[0] > buffer->size) {
     err = CL_INVALID_VALUE;
     goto error;
   }
@@ -1733,8 +1737,12 @@ clEnqueueCopyBufferRect(cl_command_queue     command_queue,
     goto error;
   }
 
-  if ((src_origin[2]+region[2])*src_slice_pitch + (src_origin[1]+region[1])*src_row_pitch + src_origin[0] + region[0] > src_buffer->size ||
-      (dst_origin[2]+region[2])*dst_slice_pitch + (dst_origin[1]+region[1])*dst_row_pitch + dst_origin[0] + region[0] > dst_buffer->size) {
+  if ((src_origin[2] + region[2] - 1) * src_slice_pitch
+        + (src_origin[1] + region[1] - 1) * src_row_pitch
+        + src_origin[0] + region[0] > src_buffer->size
+      ||(dst_origin[2] + region[2] - 1) * dst_slice_pitch
+          + (dst_origin[1] + region[1] - 1) * dst_row_pitch
+          + dst_origin[0] + region[0] > dst_buffer->size) {
     err = CL_INVALID_VALUE;
     goto error;
   }