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));