Skip to content

Commit a159553

Browse files
committed
Fix memory leak in loader urEventSetCallback
If the function pointer passed into the function was null, then the wrapper is leaked. This change re-orders things so the wrapper is created later.
1 parent 45b8e19 commit a159553

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

scripts/templates/ldrddi.cpp.mako

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,6 @@ namespace ur_loader
6565
%>${th.get_initial_null_set(obj)}
6666

6767
[[maybe_unused]] auto context = getContext();
68-
%if func_basename == "EventSetCallback":
69-
70-
// Replace the callback with a wrapper function that gives the callback the loader event rather than a
71-
// backend-specific event
72-
auto wrapper_data =
73-
new event_callback_wrapper_data_t{pfnNotify, hEvent, pUserData};
74-
pUserData = wrapper_data;
75-
pfnNotify = event_callback_wrapper;
76-
%endif
7768
%if func_basename == "AdapterGet":
7869

7970
size_t adapterIndex = 0;
@@ -165,6 +156,16 @@ namespace ur_loader
165156
<%break%>
166157
%endif
167158
%endfor
159+
%if func_basename == "EventSetCallback":
160+
161+
// Replace the callback with a wrapper function that gives the callback the loader event rather than a
162+
// backend-specific event
163+
auto *wrapper_data =
164+
new event_callback_wrapper_data_t{pfnNotify, hEvent, pUserData};
165+
pUserData = wrapper_data;
166+
pfnNotify = event_callback_wrapper;
167+
168+
%endif
168169
%for i, item in enumerate(th.get_loader_prologue(n, tags, obj, meta)):
169170
%if 'range' in item:
170171
<%

source/loader/ur_ldrddi.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4506,20 +4506,20 @@ __urdlllocal ur_result_t UR_APICALL urEventSetCallback(
45064506

45074507
[[maybe_unused]] auto context = getContext();
45084508

4509-
// Replace the callback with a wrapper function that gives the callback the loader event rather than a
4510-
// backend-specific event
4511-
auto wrapper_data =
4512-
new event_callback_wrapper_data_t{pfnNotify, hEvent, pUserData};
4513-
pUserData = wrapper_data;
4514-
pfnNotify = event_callback_wrapper;
4515-
45164509
// extract platform's function pointer table
45174510
auto dditable = reinterpret_cast<ur_event_object_t *>(hEvent)->dditable;
45184511
auto pfnSetCallback = dditable->ur.Event.pfnSetCallback;
45194512
if (nullptr == pfnSetCallback) {
45204513
return UR_RESULT_ERROR_UNINITIALIZED;
45214514
}
45224515

4516+
// Replace the callback with a wrapper function that gives the callback the loader event rather than a
4517+
// backend-specific event
4518+
auto *wrapper_data =
4519+
new event_callback_wrapper_data_t{pfnNotify, hEvent, pUserData};
4520+
pUserData = wrapper_data;
4521+
pfnNotify = event_callback_wrapper;
4522+
45234523
// convert loader handle to platform handle
45244524
hEvent = reinterpret_cast<ur_event_object_t *>(hEvent)->handle;
45254525

0 commit comments

Comments
 (0)