Skip to content

Commit 8e84eec

Browse files
committed
Poison shadow memory on CPU side by using memset
1 parent 920a968 commit 8e84eec

File tree

1 file changed

+29
-15
lines changed

1 file changed

+29
-15
lines changed

source/loader/layers/sanitizer/asan_interceptor.cpp

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#include "asan_interceptor.hpp"
1515
#include "ur_sanitizer_layer.hpp"
1616

17+
#include <dlfcn.h>
18+
1719
namespace ur_sanitizer_layer {
1820

1921
namespace {
@@ -353,11 +355,6 @@ ur_result_t SanitizerInterceptor::enqueueMemSetShadow(
353355
ur_queue_handle_t Queue, uptr Ptr, uptr Size, u8 Value,
354356
ur_event_handle_t DepEvent, ur_event_handle_t *OutEvent) {
355357

356-
uint32_t NumEventsInWaitList = DepEvent ? 1 : 0;
357-
const ur_event_handle_t *EventsWaitList = DepEvent ? &DepEvent : nullptr;
358-
ur_event_handle_t InternalEvent{};
359-
ur_event_handle_t *Event = OutEvent ? OutEvent : &InternalEvent;
360-
361358
auto ContextInfo = getContextInfo(Context);
362359
auto DeviceInfo = ContextInfo->getDeviceInfo(Device);
363360

@@ -366,23 +363,40 @@ ur_result_t SanitizerInterceptor::enqueueMemSetShadow(
366363
uptr ShadowEnd =
367364
MemToShadow_CPU(DeviceInfo->ShadowOffset, Ptr + Size - 1);
368365

369-
const char Pattern[] = {(char)Value};
370-
auto URes = context.urDdiTable.Enqueue.pfnUSMFill(
371-
Queue, (void *)ShadowBegin, 1, Pattern, ShadowEnd - ShadowBegin + 1,
372-
NumEventsInWaitList, EventsWaitList, Event);
366+
// Poison shadow memory outside of asan runtime is not allowed, so we
367+
// need to avoid memset's call from being intercepted.
368+
static void *memset_ptr = []() {
369+
void *handle = dlopen("libc.so.6", RTLD_LAZY);
370+
if (!handle) {
371+
context.logger.error("dlopen failed: {}", dlerror());
372+
return (void *)nullptr;
373+
}
374+
void *ptr = dlsym(handle, "memset");
375+
if (!ptr) {
376+
context.logger.error("dlsym failed: {}", dlerror());
377+
return (void *)nullptr;
378+
}
379+
return ptr;
380+
}();
381+
382+
assert(nullptr != memset_ptr);
383+
((void *(*)(void *, int, size_t))memset_ptr)(
384+
(void *)ShadowBegin, Value, ShadowEnd - ShadowBegin + 1);
373385
context.logger.debug(
374-
"enqueueMemSetShadow (addr={}, count={}, value={}): {}",
386+
"enqueueMemSetShadow (addr={}, count={}, value={})",
375387
(void *)ShadowBegin, ShadowEnd - ShadowBegin + 1,
376-
(void *)(size_t)Value, URes);
377-
if (URes != UR_RESULT_SUCCESS) {
378-
context.logger.error("urEnqueueUSMFill(): {}", URes);
379-
return URes;
380-
}
388+
(void *)(size_t)Value);
381389
} else if (DeviceInfo->Type == DeviceType::GPU_PVC) {
382390
uptr ShadowBegin = MemToShadow_PVC(DeviceInfo->ShadowOffset, Ptr);
383391
uptr ShadowEnd =
384392
MemToShadow_PVC(DeviceInfo->ShadowOffset, Ptr + Size - 1);
385393

394+
uint32_t NumEventsInWaitList = DepEvent ? 1 : 0;
395+
const ur_event_handle_t *EventsWaitList =
396+
DepEvent ? &DepEvent : nullptr;
397+
ur_event_handle_t InternalEvent{};
398+
ur_event_handle_t *Event = OutEvent ? OutEvent : &InternalEvent;
399+
386400
{
387401
static const size_t PageSize = [Context, Device]() {
388402
size_t Size;

0 commit comments

Comments
 (0)