Fix memory leak in ShaderModuleBase::MakeError
Change the ShaderModuleBase::MakeError to return a Ref<ShaderModuleBase>
rather than a naked pointer. This Ref will be used and finally detached in
DeviceBase::APICreateShaderModule.
Bug: chromium:1223546
Change-Id: Ie4213f091e37fdc61c6e1f0bb742e8787bcb4eb8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/58660
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Zhaoming Jiang <zhaoming.jiang@intel.com>
diff --git a/src/dawn_native/Device.cpp b/src/dawn_native/Device.cpp
index 32c13f0..8643414 100644
--- a/src/dawn_native/Device.cpp
+++ b/src/dawn_native/Device.cpp
@@ -844,6 +844,7 @@
std::unique_ptr<OwnedCompilationMessages> compilationMessages(
std::make_unique<OwnedCompilationMessages>());
if (ConsumedError(CreateShaderModule(descriptor, compilationMessages.get()), &result)) {
+ DAWN_ASSERT(result == nullptr);
result = ShaderModuleBase::MakeError(this);
}
// Move compilation messages into ShaderModuleBase and emit tint errors and warnings
diff --git a/src/dawn_native/ShaderModule.cpp b/src/dawn_native/ShaderModule.cpp
index bdff7a7..4c23874 100644
--- a/src/dawn_native/ShaderModule.cpp
+++ b/src/dawn_native/ShaderModule.cpp
@@ -1307,8 +1307,8 @@
}
// static
- ShaderModuleBase* ShaderModuleBase::MakeError(DeviceBase* device) {
- return new ShaderModuleBase(device, ObjectBase::kError);
+ Ref<ShaderModuleBase> ShaderModuleBase::MakeError(DeviceBase* device) {
+ return AcquireRef(new ShaderModuleBase(device, ObjectBase::kError));
}
bool ShaderModuleBase::HasEntryPoint(const std::string& entryPoint) const {
diff --git a/src/dawn_native/ShaderModule.h b/src/dawn_native/ShaderModule.h
index dd3d34a..2717042 100644
--- a/src/dawn_native/ShaderModule.h
+++ b/src/dawn_native/ShaderModule.h
@@ -166,7 +166,7 @@
ShaderModuleBase(DeviceBase* device, const ShaderModuleDescriptor* descriptor);
~ShaderModuleBase() override;
- static ShaderModuleBase* MakeError(DeviceBase* device);
+ static Ref<ShaderModuleBase> MakeError(DeviceBase* device);
// Return true iff the program has an entrypoint called `entryPoint`.
bool HasEntryPoint(const std::string& entryPoint) const;