From d70ad1a4f9110d206b079398dc1c3be43894f3e5 Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Fri, 14 Mar 2014 11:31:11 +0100 Subject: clover: Fix region size error checking in some buffer transfer commands. Tested-by: Tom Stellard --- src/gallium/state_trackers/clover/api/transfer.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/gallium/state_trackers') diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp b/src/gallium/state_trackers/clover/api/transfer.cpp index 72f0b3041a9..e41b7f24f82 100644 --- a/src/gallium/state_trackers/clover/api/transfer.cpp +++ b/src/gallium/state_trackers/clover/api/transfer.cpp @@ -49,6 +49,17 @@ namespace { return pitch; } + /// + /// Size of a region in bytes. + /// + size_t + size(const vector_t &pitch, const vector_t ®ion) { + if (any_of(is_zero(), region)) + return 0; + else + return dot(pitch, region - vector_t{ 0, 1, 1 }); + } + /// /// Common argument checking shared by memory transfer commands. /// @@ -75,7 +86,7 @@ namespace { throw error(CL_INVALID_VALUE); // ...and within the specified object. - if (dot(pitch, origin) + pitch[2] * region[2] > mem.size()) + if (dot(pitch, origin) + size(pitch, origin) > mem.size()) throw error(CL_INVALID_VALUE); if (any_of(is_zero(), region)) @@ -128,8 +139,8 @@ namespace { auto src_offset = dot(src_pitch, src_orig); if (interval_overlaps()( - dst_offset, dst_offset + dst_pitch[2] * region[2], - src_offset, src_offset + src_pitch[2] * region[2])) + dst_offset, dst_offset + size(dst_pitch, region), + src_offset, src_offset + size(src_pitch, region))) throw error(CL_MEM_COPY_OVERLAP); } } @@ -199,10 +210,10 @@ namespace { return [=, &q](event &) { auto dst = _map::get(q, dst_obj, CL_MAP_WRITE, dot(dst_pitch, dst_orig), - dst_pitch[2] * region[2]); + size(dst_pitch, region)); auto src = _map::get(q, src_obj, CL_MAP_READ, dot(src_pitch, src_orig), - src_pitch[2] * region[2]); + size(src_pitch, region)); vector_t v = {}; for (v[2] = 0; v[2] < region[2]; ++v[2]) { -- cgit v1.2.3