Skip to content

Commit 0809666

Browse files
authored
[UR][L0] Guard against use after free for barrier events (#18164)
Signed-off-by: Neil R. Spruit <[email protected]>
1 parent 6b62029 commit 0809666

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

unified-runtime/source/adapters/level_zero/event.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -890,13 +890,14 @@ urEventRelease(/** [in] handle of the event object */ ur_event_handle_t Event) {
890890
(Event->CommandType == UR_COMMAND_EVENTS_WAIT ||
891891
Event->CommandType == UR_COMMAND_EVENTS_WAIT_WITH_BARRIER) &&
892892
Event->Completed;
893-
UR_CALL(urEventReleaseInternal(Event));
893+
bool isEventDeleted = false;
894+
UR_CALL(urEventReleaseInternal(Event, &isEventDeleted));
894895
// If this is a Completed Event Wait Out Event, then we need to cleanup the
895896
// event at user release and not at the time of completion.
896897
// If the event is labelled as completed and no additional references are
897898
// removed, then we still need to decrement the event, but not mark as
898899
// completed.
899-
if (isEventsWaitCompleted) {
900+
if (isEventsWaitCompleted & !isEventDeleted) {
900901
if (Event->CleanedUp) {
901902
UR_CALL(urEventReleaseInternal(Event));
902903
} else {
@@ -1087,12 +1088,13 @@ ur_event_handle_t_::~ur_event_handle_t_() {
10871088
}
10881089
}
10891090

1090-
ur_result_t urEventReleaseInternal(ur_event_handle_t Event) {
1091+
ur_result_t urEventReleaseInternal(ur_event_handle_t Event,
1092+
bool *isEventDeleted) {
10911093
if (!Event->RefCount.decrementAndTest())
10921094
return UR_RESULT_SUCCESS;
10931095

10941096
if (Event->OriginAllocEvent) {
1095-
urEventReleaseInternal(Event->OriginAllocEvent);
1097+
urEventReleaseInternal(Event->OriginAllocEvent, isEventDeleted);
10961098
}
10971099

10981100
if (Event->CommandType == UR_COMMAND_MEM_UNMAP && Event->CommandData) {
@@ -1133,7 +1135,7 @@ ur_result_t urEventReleaseInternal(ur_event_handle_t Event) {
11331135
// and release a reference to it.
11341136
if (Event->HostVisibleEvent && Event->HostVisibleEvent != Event) {
11351137
// Decrement ref-count of the host-visible proxy event.
1136-
UR_CALL(urEventReleaseInternal(Event->HostVisibleEvent));
1138+
UR_CALL(urEventReleaseInternal(Event->HostVisibleEvent, isEventDeleted));
11371139
}
11381140

11391141
// Save pointer to the queue before deleting/resetting event.
@@ -1162,6 +1164,9 @@ ur_result_t urEventReleaseInternal(ur_event_handle_t Event) {
11621164
// must released later.
11631165
if (DisableEventsCaching || !Event->OwnNativeHandle) {
11641166
delete Event;
1167+
if (isEventDeleted) {
1168+
*isEventDeleted = true;
1169+
}
11651170
} else {
11661171
Event->Context->addEventToContextCache(Event);
11671172
}

unified-runtime/source/adapters/level_zero/event.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
#include "ur_api.h"
3030

3131
extern "C" {
32-
ur_result_t urEventReleaseInternal(ur_event_handle_t Event);
32+
ur_result_t urEventReleaseInternal(ur_event_handle_t Event,
33+
bool *isEventDeleted = nullptr);
3334
ur_result_t EventCreate(ur_context_handle_t Context, ur_queue_handle_t Queue,
3435
bool IsMultiDevice, bool HostVisible,
3536
ur_event_handle_t *RetEvent,

0 commit comments

Comments
 (0)