dawn/wire: Fix dangling pointers in future-related objects - Part I This patch fixes all the dangling pointer issues in `Buffer::MapAsyncEvent`, `PopErrorScopeEvent` and `WorkDoneEvent`. Bug: dawn:2345 Change-Id: I8d63bea0a29e72a63187cb801ae7242361bc2fa6 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/183024 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Jiawei Shao <jiawei.shao@intel.com> Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/wire/client/Buffer.cpp b/src/dawn/wire/client/Buffer.cpp index 1caaf47..c824a18 100644 --- a/src/dawn/wire/client/Buffer.cpp +++ b/src/dawn/wire/client/Buffer.cpp
@@ -66,7 +66,7 @@ mBuffer->Reference(); } - ~MapAsyncEvent() override { mBuffer->Release(); } + ~MapAsyncEvent() override { mBuffer.ExtractAsDangling()->Release(); } EventType GetType() override { return kType; } @@ -169,7 +169,7 @@ auto Callback = [this, &status]() { if (mCallback) { - mCallback(status, mUserdata); + mCallback(status, mUserdata.ExtractAsDangling()); } }; @@ -201,14 +201,12 @@ } WGPUBufferMapCallback mCallback; - // TODO(https://crbug.com/dawn/2345): Investigate `DanglingUntriaged` in dawn/wire. - raw_ptr<void, DanglingUntriaged> mUserdata; + raw_ptr<void> mUserdata; std::optional<WGPUBufferMapAsyncStatus> mStatus; // Strong reference to the buffer so that when we call the callback we can pass the buffer. - // TODO(https://crbug.com/dawn/2345): Investigate `DanglingUntriaged` in dawn/wire. - const raw_ptr<Buffer, DanglingUntriaged> mBuffer; + raw_ptr<Buffer> mBuffer; }; // static
diff --git a/src/dawn/wire/client/Device.cpp b/src/dawn/wire/client/Device.cpp index a54d3e5..3762b98 100644 --- a/src/dawn/wire/client/Device.cpp +++ b/src/dawn/wire/client/Device.cpp
@@ -71,19 +71,19 @@ mStatus = WGPUPopErrorScopeStatus_InstanceDropped; mMessage = std::nullopt; } + void* userdata = mUserdata.ExtractAsDangling(); if (mOldCallback) { - mOldCallback(mType, mMessage ? mMessage->c_str() : nullptr, mUserdata); + mOldCallback(mType, mMessage ? mMessage->c_str() : nullptr, userdata); } if (mCallback) { - mCallback(mStatus, mType, mMessage ? mMessage->c_str() : nullptr, mUserdata); + mCallback(mStatus, mType, mMessage ? mMessage->c_str() : nullptr, userdata); } } // TODO(crbug.com/dawn/2021) Remove the old callback type. WGPUPopErrorScopeCallback mCallback; WGPUErrorCallback mOldCallback; - // TODO(https://crbug.com/dawn/2345): Investigate `DanglingUntriaged` in dawn/wire. - raw_ptr<void, DanglingUntriaged> mUserdata; + raw_ptr<void> mUserdata; WGPUPopErrorScopeStatus mStatus = WGPUPopErrorScopeStatus_Success; WGPUErrorType mType = WGPUErrorType_Unknown;
diff --git a/src/dawn/wire/client/Queue.cpp b/src/dawn/wire/client/Queue.cpp index 18f696d..cfdf86b 100644 --- a/src/dawn/wire/client/Queue.cpp +++ b/src/dawn/wire/client/Queue.cpp
@@ -62,13 +62,12 @@ mStatus = WGPUQueueWorkDoneStatus_Success; } if (mCallback) { - mCallback(mStatus, mUserdata); + mCallback(mStatus, mUserdata.ExtractAsDangling()); } } WGPUQueueWorkDoneCallback mCallback; - // TODO(https://crbug.com/dawn/2345): Investigate `DanglingUntriaged` in dawn/wire. - raw_ptr<void, DanglingUntriaged> mUserdata; + raw_ptr<void> mUserdata; WGPUQueueWorkDoneStatus mStatus = WGPUQueueWorkDoneStatus_Success; };