From b96e25c5f89f374b26e0664b7cce54aa7d5e2079 Mon Sep 17 00:00:00 2001 From: Todd tiantuo Li Date: Mon, 16 Mar 2020 16:41:10 -0700 Subject: [PATCH] SWDEV-222615 - delete VirtualGPU::Queue and return NULL when Pal::IDevice::CreateQueue() fails, in order to avoid undefined behavior and crash. Change-Id: I4b94d3b3b0495530a8bf7840dc77a98aed9aa8ae --- rocclr/device/pal/palvirtual.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rocclr/device/pal/palvirtual.cpp b/rocclr/device/pal/palvirtual.cpp index 4e3d6672dd..111a9f31df 100644 --- a/rocclr/device/pal/palvirtual.cpp +++ b/rocclr/device/pal/palvirtual.cpp @@ -149,6 +149,9 @@ VirtualGPU::Queue* VirtualGPU::Queue::Create(const VirtualGPU& gpu, Pal::QueueTy info->engineType_ = qCreateInfo.engineType; // Save uniqueue index for scratch buffer access info->index_ = index; + } else { + delete queue; + return nullptr; } } else { int usage = std::numeric_limits::max(); @@ -157,7 +160,7 @@ VirtualGPU::Queue* VirtualGPU::Queue::Create(const VirtualGPU& gpu, Pal::QueueTy for (const auto& it : gpu.dev().QueuePool()) { if ((qCreateInfo.engineType == it.second->engineType_) && (it.second->counter_ <= usage)) { - if ((it.second->counter_ < usage) || + if ((it.second->counter_ < usage) || // Preserve the order of allocations, because SDMA engines // should be used in round-robin manner ((it.second->counter_ == usage) && (it.second->index_ < indexBase))) {