Guard against reentrancy in SupportsUserData::RemoveUserData().
Bug: 1414218
Change-Id: I8a0e97539433c1d86557d2bfa899ea7cfd374412
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4416617
Commit-Queue: Daniel Cheng <[email protected]>
Reviewed-by: Scott Violet <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1129075}
diff --git a/base/supports_user_data_unittest.cc b/base/supports_user_data_unittest.cc
index 309fe18..f3b93f8 100644
--- a/base/supports_user_data_unittest.cc
+++ b/base/supports_user_data_unittest.cc
@@ -110,6 +110,23 @@
EXPECT_FALSE(supports_user_data.TakeUserData(&key1));
}
+class DataOwnsSupportsUserData : public SupportsUserData::Data {
+ public:
+ TestSupportsUserData* supports_user_data() { return &supports_user_data_; }
+
+ private:
+ TestSupportsUserData supports_user_data_;
+};
+
+// Tests that removing a `SupportsUserData::Data` that owns a `SupportsUserData`
+// does not crash.
+TEST_P(SupportsUserDataTest, ReentrantRemoveUserData) {
+ DataOwnsSupportsUserData* data = new DataOwnsSupportsUserData;
+ char key = 0;
+ data->supports_user_data()->SetUserData(&key, WrapUnique(data));
+ data->supports_user_data()->RemoveUserData(&key);
+}
+
INSTANTIATE_TEST_SUITE_P(All,
SupportsUserDataTest,
testing::Values(false, true));