Commit e6092f3b by Ben Clayton

Fix memory corruption SpirvShaderKey::SpecializationInfo

SpecializationInfo was default copy-constructed / assigned, and held a raw pointer to the copy of the VkSpecializationInfo. This struct was deleted in the destructor, trashing any other copies. Fixes undefined behavior and crashes of a few Vulkan samples. Bug b/123588002 Change-Id: I7adcec2d51bc357ef5bcee1ec6bdafe9ecd208a7 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/34454 Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarBen Clayton <bclayton@google.com>
parent 03c2aea0
...@@ -22,9 +22,11 @@ PipelineCache::SpirvShaderKey::SpecializationInfo::SpecializationInfo(const VkSp ...@@ -22,9 +22,11 @@ PipelineCache::SpirvShaderKey::SpecializationInfo::SpecializationInfo(const VkSp
{ {
if(specializationInfo) if(specializationInfo)
{ {
info = reinterpret_cast<VkSpecializationInfo*>( auto ptr = reinterpret_cast<VkSpecializationInfo*>(
allocate(sizeof(VkSpecializationInfo), REQUIRED_MEMORY_ALIGNMENT, DEVICE_MEMORY)); allocate(sizeof(VkSpecializationInfo), REQUIRED_MEMORY_ALIGNMENT, DEVICE_MEMORY));
info = std::shared_ptr<VkSpecializationInfo>(ptr, Deleter());
info->mapEntryCount = specializationInfo->mapEntryCount; info->mapEntryCount = specializationInfo->mapEntryCount;
if(specializationInfo->mapEntryCount > 0) if(specializationInfo->mapEntryCount > 0)
{ {
...@@ -42,10 +44,14 @@ PipelineCache::SpirvShaderKey::SpecializationInfo::SpecializationInfo(const VkSp ...@@ -42,10 +44,14 @@ PipelineCache::SpirvShaderKey::SpecializationInfo::SpecializationInfo(const VkSp
memcpy(data, specializationInfo->pData, specializationInfo->dataSize); memcpy(data, specializationInfo->pData, specializationInfo->dataSize);
info->pData = data; info->pData = data;
} }
else
{
info->pData = nullptr;
}
} }
} }
PipelineCache::SpirvShaderKey::SpecializationInfo::~SpecializationInfo() void PipelineCache::SpirvShaderKey::SpecializationInfo::Deleter::operator() (VkSpecializationInfo* info) const
{ {
if(info) if(info)
{ {
......
...@@ -52,14 +52,18 @@ public: ...@@ -52,14 +52,18 @@ public:
struct SpecializationInfo struct SpecializationInfo
{ {
SpecializationInfo(const VkSpecializationInfo* specializationInfo); SpecializationInfo(const VkSpecializationInfo* specializationInfo);
~SpecializationInfo();
bool operator<(const SpecializationInfo& specializationInfo) const; bool operator<(const SpecializationInfo& specializationInfo) const;
VkSpecializationInfo* get() const { return info; } const VkSpecializationInfo* get() const { return info.get(); }
private: private:
VkSpecializationInfo* info = nullptr; struct Deleter
{
void operator()(VkSpecializationInfo*) const;
};
std::shared_ptr<VkSpecializationInfo> info;
}; };
SpirvShaderKey(const VkShaderStageFlagBits pipelineStage, SpirvShaderKey(const VkShaderStageFlagBits pipelineStage,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment