Mesa (master): clover: Don't crash on NULL global buffer objects.

Francisco Jerez currojerez at kemper.freedesktop.org
Wed Jan 22 12:44:20 UTC 2014


Module: Mesa
Branch: master
Commit: 6ec210989fa10847091f06fcfcab77dd07618dff
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6ec210989fa10847091f06fcfcab77dd07618dff

Author: Jan Vesely <jan.vesely at rutgers.edu>
Date:   Thu Jan 16 20:22:14 2014 -0500

clover: Don't crash on NULL global buffer objects.

Specs say "If the argument is a buffer object, the arg_value
pointer can be NULL or point to a NULL value in which case a NULL
value will be used as the value for the argument declared as a
pointer to __global or __constant memory in the kernel."

So don't crash when somebody does that.

v2: Insert NULL into input buffer instead of buffer handle pair
    Fix constant_argument too
    Drop r600 driver changes

v3: Fix inserting NULL pointer

Signed-off-by: Jan Vesely <jan.vesely at rutgers.edu>
Reviewed-by: Francisco Jerez <currojerez at riseup.net>

---

 src/gallium/state_trackers/clover/core/kernel.cpp |   34 ++++++++++++++-------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp
index 58780d6..6d894cd 100644
--- a/src/gallium/state_trackers/clover/core/kernel.cpp
+++ b/src/gallium/state_trackers/clover/core/kernel.cpp
@@ -327,7 +327,7 @@ kernel::global_argument::set(size_t size, const void *value) {
    if (size != sizeof(cl_mem))
       throw error(CL_INVALID_ARG_SIZE);
 
-   buf = &obj<buffer>(*(cl_mem *)value);
+   buf = pobj<buffer>(value ? *(cl_mem *)value : NULL);
    _set = true;
 }
 
@@ -335,8 +335,14 @@ void
 kernel::global_argument::bind(exec_context &ctx,
                               const module::argument &marg) {
    align(ctx.input, marg.target_align);
-   ctx.g_handles.push_back(allocate(ctx.input, marg.target_size));
-   ctx.g_buffers.push_back(buf->resource(*ctx.q).pipe);
+
+   if (buf) {
+      ctx.g_handles.push_back(allocate(ctx.input, marg.target_size));
+      ctx.g_buffers.push_back(buf->resource(*ctx.q).pipe);
+   } else {
+      // Null pointer.
+      allocate(ctx.input, marg.target_size);
+   }
 }
 
 void
@@ -379,22 +385,28 @@ kernel::constant_argument::set(size_t size, const void *value) {
    if (size != sizeof(cl_mem))
       throw error(CL_INVALID_ARG_SIZE);
 
-   buf = &obj<buffer>(*(cl_mem *)value);
+   buf = pobj<buffer>(value ? *(cl_mem *)value : NULL);
    _set = true;
 }
 
 void
 kernel::constant_argument::bind(exec_context &ctx,
                                 const module::argument &marg) {
-   auto v = bytes(ctx.resources.size() << 24);
-
-   extend(v, module::argument::zero_ext, marg.target_size);
-   byteswap(v, ctx.q->dev.endianness());
    align(ctx.input, marg.target_align);
-   insert(ctx.input, v);
 
-   st = buf->resource(*ctx.q).bind_surface(*ctx.q, false);
-   ctx.resources.push_back(st);
+   if (buf) {
+      auto v = bytes(ctx.resources.size() << 24);
+
+      extend(v, module::argument::zero_ext, marg.target_size);
+      byteswap(v, ctx.q->dev.endianness());
+      insert(ctx.input, v);
+
+      st = buf->resource(*ctx.q).bind_surface(*ctx.q, false);
+      ctx.resources.push_back(st);
+   } else {
+      // Null pointer.
+      allocate(ctx.input, marg.target_size);
+   }
 }
 
 void




More information about the mesa-commit mailing list