summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRebecca N. Palmer <rebecca_palmer@zoho.com>2015-02-04 18:00:37 +0000
committerZhigang Gong <zhigang.gong@intel.com>2015-02-06 15:08:14 +0800
commit14d9028bb97e905c1c3f488f8d37393675ccad8d (patch)
tree700bd9276a08df51125a699bac09330f2d96726a
parent24b2adbd958884d5874dc12f456cee9889583967 (diff)
downloadbeignet-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.c23
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) {