diff --git a/source/loader/layers/sanitizer/asan/asan_interceptor.cpp b/source/loader/layers/sanitizer/asan/asan_interceptor.cpp index fb2a01101e..fb1cf1c244 100644 --- a/source/loader/layers/sanitizer/asan/asan_interceptor.cpp +++ b/source/loader/layers/sanitizer/asan/asan_interceptor.cpp @@ -171,7 +171,10 @@ ur_result_t AsanInterceptor::releaseMemory(ur_context_handle_t Context, if (!AllocInfoItOp) { // "Addr" might be a host pointer ReportBadFree(Addr, GetCurrentBacktrace(), nullptr); - return UR_RESULT_ERROR_INVALID_ARGUMENT; + if (getOptions().HaltOnError) { + exitWithErrors(); + } + return UR_RESULT_SUCCESS; } auto AllocInfoIt = *AllocInfoItOp; @@ -186,17 +189,26 @@ ur_result_t AsanInterceptor::releaseMemory(ur_context_handle_t Context, // "Addr" might be a host pointer ReportBadFree(Addr, GetCurrentBacktrace(), nullptr); } - return UR_RESULT_ERROR_INVALID_ARGUMENT; + if (getOptions().HaltOnError) { + exitWithErrors(); + } + return UR_RESULT_SUCCESS; } if (Addr != AllocInfo->UserBegin) { ReportBadFree(Addr, GetCurrentBacktrace(), AllocInfo); - return UR_RESULT_ERROR_INVALID_ARGUMENT; + if (getOptions().HaltOnError) { + exitWithErrors(); + } + return UR_RESULT_SUCCESS; } if (AllocInfo->IsReleased) { ReportDoubleFree(Addr, GetCurrentBacktrace(), AllocInfo); - return UR_RESULT_ERROR_INVALID_ARGUMENT; + if (getOptions().HaltOnError) { + exitWithErrors(); + } + return UR_RESULT_SUCCESS; } AllocInfo->IsReleased = true; diff --git a/source/loader/layers/sanitizer/asan/asan_options.cpp b/source/loader/layers/sanitizer/asan/asan_options.cpp index 7704547d38..799c892ff1 100644 --- a/source/loader/layers/sanitizer/asan/asan_options.cpp +++ b/source/loader/layers/sanitizer/asan/asan_options.cpp @@ -90,6 +90,7 @@ AsanOptions::AsanOptions() { SetBoolOption("detect_privates", DetectPrivates); SetBoolOption("print_stats", PrintStats); SetBoolOption("detect_leaks", DetectLeaks); + SetBoolOption("halt_on_error", HaltOnError); auto KV = OptionsEnvMap->find("quarantine_size_mb"); if (KV != OptionsEnvMap->end()) { diff --git a/source/loader/layers/sanitizer/asan/asan_options.hpp b/source/loader/layers/sanitizer/asan/asan_options.hpp index 4da32ca278..cea30351d3 100644 --- a/source/loader/layers/sanitizer/asan/asan_options.hpp +++ b/source/loader/layers/sanitizer/asan/asan_options.hpp @@ -28,6 +28,7 @@ struct AsanOptions { bool PrintStats = false; bool DetectKernelArguments = true; bool DetectLeaks = true; + bool HaltOnError = true; explicit AsanOptions(); };