diff options
author | Rebecca N. Palmer <rebecca_palmer@zoho.com> | 2015-02-04 18:00:37 +0000 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@intel.com> | 2015-02-06 15:08:14 +0800 |
commit | 14d9028bb97e905c1c3f488f8d37393675ccad8d (patch) | |
tree | 700bd9276a08df51125a699bac09330f2d96726a | |
parent | 24b2adbd958884d5874dc12f456cee9889583967 (diff) | |
download | beignet-14d9028bb97e905c1c3f488f8d37393675ccad8d.tar.gz |
Return error, don't crash, on allocation failure
As previously noted, when cl_mem_allocate fails, its error handling
then calls cl_mem_delete on the incompletely-set-up buffer, which
aborts at assert(mem->ctx).
This patch appears to fix the problem, but be warned I don't know this
code well enough to know what else it might break.
Signed-off-by: Rebecca Palmer <rebecca_palmer@zoho.com>
Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
-rw-r--r-- | src/cl_mem.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/cl_mem.c b/src/cl_mem.c index 36ef2ce2..99554f3b 100644 --- a/src/cl_mem.c +++ b/src/cl_mem.c @@ -1070,16 +1070,19 @@ cl_mem_delete(cl_mem mem) } /* Remove it from the list */ - assert(mem->ctx); - pthread_mutex_lock(&mem->ctx->buffer_lock); - if (mem->prev) - mem->prev->next = mem->next; - if (mem->next) - mem->next->prev = mem->prev; - if (mem->ctx->buffers == mem) - mem->ctx->buffers = mem->next; - pthread_mutex_unlock(&mem->ctx->buffer_lock); - cl_context_delete(mem->ctx); + if (mem->ctx) { + pthread_mutex_lock(&mem->ctx->buffer_lock); + if (mem->prev) + mem->prev->next = mem->next; + if (mem->next) + mem->next->prev = mem->prev; + if (mem->ctx->buffers == mem) + mem->ctx->buffers = mem->next; + pthread_mutex_unlock(&mem->ctx->buffer_lock); + cl_context_delete(mem->ctx); + } else { + assert((mem->prev == 0) && (mem->next == 0)); + } /* Someone still mapped, unmap */ if(mem->map_ref > 0) { |