14
14
#include " asan_interceptor.hpp"
15
15
#include " ur_sanitizer_layer.hpp"
16
16
17
+ #include < dlfcn.h>
18
+
17
19
namespace ur_sanitizer_layer {
18
20
19
21
namespace {
@@ -353,11 +355,6 @@ ur_result_t SanitizerInterceptor::enqueueMemSetShadow(
353
355
ur_queue_handle_t Queue, uptr Ptr, uptr Size, u8 Value,
354
356
ur_event_handle_t DepEvent, ur_event_handle_t *OutEvent) {
355
357
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
-
361
358
auto ContextInfo = getContextInfo (Context);
362
359
auto DeviceInfo = ContextInfo->getDeviceInfo (Device);
363
360
@@ -366,23 +363,40 @@ ur_result_t SanitizerInterceptor::enqueueMemSetShadow(
366
363
uptr ShadowEnd =
367
364
MemToShadow_CPU (DeviceInfo->ShadowOffset , Ptr + Size - 1 );
368
365
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 );
373
385
context.logger .debug (
374
- " enqueueMemSetShadow (addr={}, count={}, value={}): {} " ,
386
+ " enqueueMemSetShadow (addr={}, count={}, value={})" ,
375
387
(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);
381
389
} else if (DeviceInfo->Type == DeviceType::GPU_PVC) {
382
390
uptr ShadowBegin = MemToShadow_PVC (DeviceInfo->ShadowOffset , Ptr);
383
391
uptr ShadowEnd =
384
392
MemToShadow_PVC (DeviceInfo->ShadowOffset , Ptr + Size - 1 );
385
393
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
+
386
400
{
387
401
static const size_t PageSize = [Context, Device]() {
388
402
size_t Size;
0 commit comments