Skip to content

Commit 59b3c3e

Browse files
committed
Merge branch 'main' into do-alloc-use-pool
2 parents ff0fdcd + 2739808 commit 59b3c3e

File tree

5 files changed

+26
-13
lines changed

5 files changed

+26
-13
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ option(UR_USE_ASAN "enable AddressSanitizer" OFF)
2727
option(UR_USE_UBSAN "enable UndefinedBehaviorSanitizer" OFF)
2828
option(UR_USE_MSAN "enable MemorySanitizer" OFF)
2929
option(UR_USE_TSAN "enable ThreadSanitizer" OFF)
30-
option(UR_USE_CFI "enable Control Flow Integrity checks (requires clang and implies -flto)" ON)
30+
option(UR_USE_CFI "enable Control Flow Integrity checks (requires clang and implies -flto)" OFF)
3131
option(UR_ENABLE_TRACING "enable api tracing through xpti" OFF)
3232
option(UR_ENABLE_SANITIZER "enable device sanitizer" ON)
3333
option(UR_ENABLE_SYMBOLIZER "enable symoblizer for sanitizer" OFF)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ List of options provided by CMake:
130130
| UR_USE_TSAN | Enable ThreadSanitizer | ON/OFF | OFF |
131131
| UR_USE_UBSAN | Enable UndefinedBehavior Sanitizer | ON/OFF | OFF |
132132
| UR_USE_MSAN | Enable MemorySanitizer (clang only) | ON/OFF | OFF |
133-
| UR_USE_CFI | Enable Control Flow Integrity checks (clang only, also enables lto) | ON/OFF | ON |
133+
| UR_USE_CFI | Enable Control Flow Integrity checks (clang only, also enables lto) | ON/OFF | OFF |
134134
| UR_ENABLE_TRACING | Enable XPTI-based tracing layer | ON/OFF | OFF |
135135
| UR_ENABLE_SANITIZER | Enable device sanitizer layer | ON/OFF | ON |
136136
| UR_CONFORMANCE_TARGET_TRIPLES | SYCL triples to build CTS device binaries for | Comma-separated list | spir64 |

source/loader/layers/sanitizer/asan/asan_ddi.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ ur_result_t setupContext(ur_context_handle_t Context, uint32_t numDevices,
5555
bool isInstrumentedKernel(ur_kernel_handle_t hKernel) {
5656
auto hProgram = GetProgram(hKernel);
5757
auto PI = getAsanInterceptor()->getProgramInfo(hProgram);
58+
if (PI == nullptr) {
59+
return false;
60+
}
5861
return PI->isKernelInstrumented(hKernel);
5962
}
6063

@@ -290,8 +293,9 @@ __urdlllocal ur_result_t UR_APICALL urProgramRetain(
290293
UR_CALL(pfnRetain(hProgram));
291294

292295
auto ProgramInfo = getAsanInterceptor()->getProgramInfo(hProgram);
293-
UR_ASSERT(ProgramInfo != nullptr, UR_RESULT_ERROR_INVALID_VALUE);
294-
ProgramInfo->RefCount++;
296+
if (ProgramInfo != nullptr) {
297+
ProgramInfo->RefCount++;
298+
}
295299

296300
return UR_RESULT_SUCCESS;
297301
}
@@ -364,6 +368,7 @@ __urdlllocal ur_result_t UR_APICALL urProgramLink(
364368

365369
UR_CALL(pfnProgramLink(hContext, count, phPrograms, pOptions, phProgram));
366370

371+
UR_CALL(getAsanInterceptor()->insertProgram(*phProgram));
367372
UR_CALL(getAsanInterceptor()->registerProgram(*phProgram));
368373

369374
return UR_RESULT_SUCCESS;
@@ -395,6 +400,7 @@ ur_result_t UR_APICALL urProgramLinkExp(
395400
UR_CALL(pfnProgramLinkExp(hContext, numDevices, phDevices, count,
396401
phPrograms, pOptions, phProgram));
397402

403+
UR_CALL(getAsanInterceptor()->insertProgram(*phProgram));
398404
UR_CALL(getAsanInterceptor()->registerProgram(*phProgram));
399405

400406
return UR_RESULT_SUCCESS;
@@ -417,8 +423,7 @@ ur_result_t UR_APICALL urProgramRelease(
417423
UR_CALL(pfnProgramRelease(hProgram));
418424

419425
auto ProgramInfo = getAsanInterceptor()->getProgramInfo(hProgram);
420-
UR_ASSERT(ProgramInfo != nullptr, UR_RESULT_ERROR_INVALID_VALUE);
421-
if (--ProgramInfo->RefCount == 0) {
426+
if (ProgramInfo != nullptr && --ProgramInfo->RefCount == 0) {
422427
UR_CALL(getAsanInterceptor()->unregisterProgram(hProgram));
423428
UR_CALL(getAsanInterceptor()->eraseProgram(hProgram));
424429
}

source/loader/layers/sanitizer/asan/asan_interceptor.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,15 +226,18 @@ ur_result_t AsanInterceptor::releaseMemory(ur_context_handle_t Context,
226226
if (ReleaseList.size()) {
227227
std::scoped_lock<ur_shared_mutex> Guard(m_AllocationMapMutex);
228228
for (auto &It : ReleaseList) {
229+
auto ToFreeAllocInfo = It->second;
229230
getContext()->logger.info("Quarantine Free: {}",
230-
(void *)It->second->AllocBegin);
231+
(void *)ToFreeAllocInfo->AllocBegin);
231232

232-
ContextInfo->Stats.UpdateUSMRealFreed(AllocInfo->AllocSize,
233-
AllocInfo->getRedzoneSize());
233+
ContextInfo->Stats.UpdateUSMRealFreed(
234+
ToFreeAllocInfo->AllocSize, ToFreeAllocInfo->getRedzoneSize());
234235

235-
m_AllocationMap.erase(It);
236236
UR_CALL(getContext()->urDdiTable.USM.pfnFree(
237-
Context, (void *)(It->second->AllocBegin)));
237+
Context, (void *)(ToFreeAllocInfo->AllocBegin)));
238+
239+
// Erase it at last to avoid use-after-free.
240+
m_AllocationMap.erase(It);
238241
}
239242
}
240243
ContextInfo->Stats.UpdateUSMFreed(AllocInfo->AllocSize);
@@ -426,6 +429,7 @@ ur_result_t AsanInterceptor::registerProgram(ur_program_handle_t Program) {
426429

427430
ur_result_t AsanInterceptor::unregisterProgram(ur_program_handle_t Program) {
428431
auto ProgramInfo = getProgramInfo(Program);
432+
assert(ProgramInfo != nullptr && "unregistered program!");
429433

430434
ProgramInfo->InstrumentedKernels.clear();
431435

@@ -464,6 +468,7 @@ ur_result_t AsanInterceptor::registerSpirKernels(ur_program_handle_t Program) {
464468
}
465469

466470
auto PI = getProgramInfo(Program);
471+
assert(PI != nullptr && "unregistered program!");
467472
for (const auto &SKI : SKInfo) {
468473
if (SKI.Size == 0) {
469474
continue;
@@ -500,6 +505,7 @@ AsanInterceptor::registerDeviceGlobals(ur_program_handle_t Program) {
500505
auto Context = GetContext(Program);
501506
auto ContextInfo = getContextInfo(Context);
502507
auto ProgramInfo = getProgramInfo(Program);
508+
assert(ProgramInfo != nullptr && "unregistered program!");
503509

504510
for (auto Device : Devices) {
505511
ManagedQueue Queue(Context, Device);

source/loader/layers/sanitizer/asan/asan_interceptor.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,10 @@ class AsanInterceptor {
339339

340340
std::shared_ptr<ProgramInfo> getProgramInfo(ur_program_handle_t Program) {
341341
std::shared_lock<ur_shared_mutex> Guard(m_ProgramMapMutex);
342-
assert(m_ProgramMap.find(Program) != m_ProgramMap.end());
343-
return m_ProgramMap[Program];
342+
if (m_ProgramMap.find(Program) != m_ProgramMap.end()) {
343+
return m_ProgramMap[Program];
344+
}
345+
return nullptr;
344346
}
345347

346348
std::shared_ptr<KernelInfo> getKernelInfo(ur_kernel_handle_t Kernel) {

0 commit comments

Comments
 (0)