Skip to content

Commit 04799e7

Browse files
authored
Merge pull request #1048 from callumfare/opencl_fix_urMemBufferCreate_leak
[OpenCL] Fix memory leak and coverity issue with struct-to-array casts
2 parents 534071e + 4cf02cb commit 04799e7

File tree

3 files changed

+40
-32
lines changed

3 files changed

+40
-32
lines changed

source/adapters/opencl/enqueue.cpp

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,16 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueMemBufferReadRect(
177177
size_t hostRowPitch, size_t hostSlicePitch, void *pDst,
178178
uint32_t numEventsInWaitList, const ur_event_handle_t *phEventWaitList,
179179
ur_event_handle_t *phEvent) {
180+
const size_t BufferOrigin[3] = {bufferOrigin.x, bufferOrigin.y,
181+
bufferOrigin.z};
182+
const size_t HostOrigin[3] = {hostOrigin.x, hostOrigin.y, hostOrigin.z};
183+
const size_t Region[3] = {region.width, region.height, region.depth};
180184

181185
auto ClErr = clEnqueueReadBufferRect(
182186
cl_adapter::cast<cl_command_queue>(hQueue),
183-
cl_adapter::cast<cl_mem>(hBuffer), blockingRead,
184-
cl_adapter::cast<const size_t *>(&bufferOrigin),
185-
cl_adapter::cast<const size_t *>(&hostOrigin),
186-
cl_adapter::cast<const size_t *>(&region), bufferRowPitch,
187-
bufferSlicePitch, hostRowPitch, hostSlicePitch, pDst, numEventsInWaitList,
187+
cl_adapter::cast<cl_mem>(hBuffer), blockingRead, BufferOrigin, HostOrigin,
188+
Region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch,
189+
pDst, numEventsInWaitList,
188190
cl_adapter::cast<const cl_event *>(phEventWaitList),
189191
cl_adapter::cast<cl_event *>(phEvent));
190192

@@ -201,14 +203,16 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueMemBufferWriteRect(
201203
size_t hostRowPitch, size_t hostSlicePitch, void *pSrc,
202204
uint32_t numEventsInWaitList, const ur_event_handle_t *phEventWaitList,
203205
ur_event_handle_t *phEvent) {
206+
const size_t BufferOrigin[3] = {bufferOrigin.x, bufferOrigin.y,
207+
bufferOrigin.z};
208+
const size_t HostOrigin[3] = {hostOrigin.x, hostOrigin.y, hostOrigin.z};
209+
const size_t Region[3] = {region.width, region.height, region.depth};
204210

205211
auto ClErr = clEnqueueWriteBufferRect(
206212
cl_adapter::cast<cl_command_queue>(hQueue),
207-
cl_adapter::cast<cl_mem>(hBuffer), blockingWrite,
208-
cl_adapter::cast<const size_t *>(&bufferOrigin),
209-
cl_adapter::cast<const size_t *>(&hostOrigin),
210-
cl_adapter::cast<const size_t *>(&region), bufferRowPitch,
211-
bufferSlicePitch, hostRowPitch, hostSlicePitch, pSrc, numEventsInWaitList,
213+
cl_adapter::cast<cl_mem>(hBuffer), blockingWrite, BufferOrigin,
214+
HostOrigin, Region, bufferRowPitch, bufferSlicePitch, hostRowPitch,
215+
hostSlicePitch, pSrc, numEventsInWaitList,
212216
cl_adapter::cast<const cl_event *>(phEventWaitList),
213217
cl_adapter::cast<cl_event *>(phEvent));
214218

@@ -245,16 +249,16 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueMemBufferCopyRect(
245249
size_t srcSlicePitch, size_t dstRowPitch, size_t dstSlicePitch,
246250
uint32_t numEventsInWaitList, const ur_event_handle_t *phEventWaitList,
247251
ur_event_handle_t *phEvent) {
252+
const size_t SrcOrigin[3] = {srcOrigin.x, srcOrigin.y, srcOrigin.z};
253+
const size_t DstOrigin[3] = {dstOrigin.x, dstOrigin.y, dstOrigin.z};
254+
const size_t Region[3] = {region.width, region.height, region.depth};
248255

249256
auto ClErr = clEnqueueCopyBufferRect(
250257
cl_adapter::cast<cl_command_queue>(hQueue),
251258
cl_adapter::cast<cl_mem>(hBufferSrc),
252-
cl_adapter::cast<cl_mem>(hBufferDst),
253-
cl_adapter::cast<const size_t *>(&srcOrigin),
254-
cl_adapter::cast<const size_t *>(&dstOrigin),
255-
cl_adapter::cast<const size_t *>(&region), srcRowPitch, srcSlicePitch,
256-
dstRowPitch, dstSlicePitch, numEventsInWaitList,
257-
cl_adapter::cast<const cl_event *>(phEventWaitList),
259+
cl_adapter::cast<cl_mem>(hBufferDst), SrcOrigin, DstOrigin, Region,
260+
srcRowPitch, srcSlicePitch, dstRowPitch, dstSlicePitch,
261+
numEventsInWaitList, cl_adapter::cast<const cl_event *>(phEventWaitList),
258262
cl_adapter::cast<cl_event *>(phEvent));
259263

260264
if (ClErr == CL_INVALID_VALUE) {
@@ -331,13 +335,14 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueMemImageRead(
331335
ur_rect_offset_t origin, ur_rect_region_t region, size_t rowPitch,
332336
size_t slicePitch, void *pDst, uint32_t numEventsInWaitList,
333337
const ur_event_handle_t *phEventWaitList, ur_event_handle_t *phEvent) {
338+
const size_t Origin[3] = {origin.x, origin.y, origin.z};
339+
const size_t Region[3] = {region.width, region.height, region.depth};
334340

335341
auto ClErr = clEnqueueReadImage(
336342
cl_adapter::cast<cl_command_queue>(hQueue),
337-
cl_adapter::cast<cl_mem>(hImage), blockingRead,
338-
cl_adapter::cast<const size_t *>(&origin),
339-
cl_adapter::cast<const size_t *>(&region), rowPitch, slicePitch, pDst,
340-
numEventsInWaitList, cl_adapter::cast<const cl_event *>(phEventWaitList),
343+
cl_adapter::cast<cl_mem>(hImage), blockingRead, Origin, Region, rowPitch,
344+
slicePitch, pDst, numEventsInWaitList,
345+
cl_adapter::cast<const cl_event *>(phEventWaitList),
341346
cl_adapter::cast<cl_event *>(phEvent));
342347

343348
if (ClErr == CL_INVALID_VALUE) {
@@ -351,13 +356,14 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueMemImageWrite(
351356
ur_rect_offset_t origin, ur_rect_region_t region, size_t rowPitch,
352357
size_t slicePitch, void *pSrc, uint32_t numEventsInWaitList,
353358
const ur_event_handle_t *phEventWaitList, ur_event_handle_t *phEvent) {
359+
const size_t Origin[3] = {origin.x, origin.y, origin.z};
360+
const size_t Region[3] = {region.width, region.height, region.depth};
354361

355362
auto ClErr = clEnqueueWriteImage(
356363
cl_adapter::cast<cl_command_queue>(hQueue),
357-
cl_adapter::cast<cl_mem>(hImage), blockingWrite,
358-
cl_adapter::cast<const size_t *>(&origin),
359-
cl_adapter::cast<const size_t *>(&region), rowPitch, slicePitch, pSrc,
360-
numEventsInWaitList, cl_adapter::cast<const cl_event *>(phEventWaitList),
364+
cl_adapter::cast<cl_mem>(hImage), blockingWrite, Origin, Region, rowPitch,
365+
slicePitch, pSrc, numEventsInWaitList,
366+
cl_adapter::cast<const cl_event *>(phEventWaitList),
361367
cl_adapter::cast<cl_event *>(phEvent));
362368

363369
if (ClErr == CL_INVALID_VALUE) {
@@ -372,13 +378,14 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueMemImageCopy(
372378
ur_rect_offset_t dstOrigin, ur_rect_region_t region,
373379
uint32_t numEventsInWaitList, const ur_event_handle_t *phEventWaitList,
374380
ur_event_handle_t *phEvent) {
381+
const size_t SrcOrigin[3] = {srcOrigin.x, srcOrigin.y, srcOrigin.z};
382+
const size_t DstOrigin[3] = {dstOrigin.x, dstOrigin.y, dstOrigin.z};
383+
const size_t Region[3] = {region.width, region.height, region.depth};
375384

376385
auto ClErr = clEnqueueCopyImage(
377386
cl_adapter::cast<cl_command_queue>(hQueue),
378387
cl_adapter::cast<cl_mem>(hImageSrc), cl_adapter::cast<cl_mem>(hImageDst),
379-
cl_adapter::cast<const size_t *>(&srcOrigin),
380-
cl_adapter::cast<const size_t *>(&dstOrigin),
381-
cl_adapter::cast<const size_t *>(&region), numEventsInWaitList,
388+
SrcOrigin, DstOrigin, Region, numEventsInWaitList,
382389
cl_adapter::cast<const cl_event *>(phEventWaitList),
383390
cl_adapter::cast<cl_event *>(phEvent));
384391

source/adapters/opencl/memory.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemBufferCreate(
264264
*phBuffer = reinterpret_cast<ur_mem_handle_t>(FuncPtr(
265265
CLContext, PropertiesIntel.data(), static_cast<cl_mem_flags>(flags),
266266
size, pProperties->pHost, cl_adapter::cast<cl_int *>(&RetErr)));
267-
CL_RETURN_ON_FAILURE(RetErr);
267+
return mapCLErrorToUR(RetErr);
268268
}
269269
}
270270

source/adapters/opencl/program.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,14 @@ UR_APIEXPORT ur_result_t UR_APICALL urProgramCreateWithBinary(
120120
const uint8_t *pBinary, const ur_program_properties_t *,
121121
ur_program_handle_t *phProgram) {
122122

123-
cl_int BinaryStatus;
123+
const cl_device_id Devices[1] = {cl_adapter::cast<cl_device_id>(hDevice)};
124+
const size_t Lengths[1] = {size};
125+
cl_int BinaryStatus[1];
124126
cl_int CLResult;
125127
*phProgram = cl_adapter::cast<ur_program_handle_t>(clCreateProgramWithBinary(
126128
cl_adapter::cast<cl_context>(hContext), cl_adapter::cast<cl_uint>(1u),
127-
cl_adapter::cast<const cl_device_id *>(&hDevice), &size, &pBinary,
128-
&BinaryStatus, &CLResult));
129-
CL_RETURN_ON_FAILURE(BinaryStatus);
129+
Devices, Lengths, &pBinary, BinaryStatus, &CLResult));
130+
CL_RETURN_ON_FAILURE(BinaryStatus[0]);
130131
CL_RETURN_ON_FAILURE(CLResult);
131132

132133
return UR_RESULT_SUCCESS;

0 commit comments

Comments
 (0)