Fix use-after-free in StructuredMetricsServiceTest teardown.

A set of StructuredMetricsServiceTests were failing on ChromeOS builds
after attempting to update protobuf to v32. The upgrade introduced a new
memory-safety check in generated proto destructors which exposed a
latent use-after-free bug during the test's teardown sequence, resulting
in a crash.

The root cause of the crash was a race condition in the test fixture's
teardown logic. On ChromeOS, the StructuredMetricsService has a more
complex, multi-threaded architecture that uses asynchronous tasks for
cleanup. The test fixture's member variables were declared in an order
that caused the object responsible for managing task execution
(base::test::TaskEnvironment) to be destroyed *before* the service that
was posting tasks to it. This led to a race where cleanup tasks could
run after their required resources had already been deallocated,
causing memory corruption.

This CL resolves the race condition by restructuring the test fixture to
follow correct RAII principles for asynchronous tests. The member
variables are reordered to guarantee that the TaskEnvironment is
destroyed last, ensuring it outlives all other members and can flush
their asynchronous tasks. In addition, the service and its dependencies
are ordered to guarantee their lifetimes are correctly managed. The
manual teardown logic is removed in favor of this robust, automatic
cleanup.

[email protected]

Bug: 439656514
Cq-Include-Trybots: luci.chromium.try:linux-chromeos-dbg
Change-Id: I5cccf88fad10c6abf450ad4a7e5271fbdbdb625a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6866551
Reviewed-by: Roger McFarlane <[email protected]>
Commit-Queue: Tommy Nyquist <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1504198}
NOKEYCHECK=True
GitOrigin-RevId: 0cbd506a1712a02f9abad68492bf5aba8b7d54e8
1 file changed
tree: 95d7d3a59b6a6b1b12d516b56de055526f25e1e3
  1. android/
  2. call_stacks/
  3. content/
  4. debug/
  5. demographics/
  6. dwa/
  7. library_support/
  8. net/
  9. private_metrics/
  10. public/
  11. serialization/
  12. structured/
  13. system_session_analyzer/
  14. test/
  15. ui/
  16. android_metrics_helper.cc
  17. android_metrics_helper.h
  18. android_metrics_helper_unittest.cc
  19. android_metrics_provider.cc
  20. android_metrics_provider.h
  21. android_metrics_provider_unittest.cc
  22. BUILD.gn
  23. child_histogram_fetcher_impl.cc
  24. child_histogram_fetcher_impl.h
  25. clean_exit_beacon.cc
  26. clean_exit_beacon.h
  27. clean_exit_beacon_ios.mm
  28. clean_exit_beacon_unittest.cc
  29. client_info.cc
  30. client_info.h
  31. cloned_install_detector.cc
  32. cloned_install_detector.h
  33. cloned_install_detector_unittest.cc
  34. component_metrics_provider.cc
  35. component_metrics_provider.h
  36. component_metrics_provider_unittest.cc
  37. cpu_metrics_provider.cc
  38. cpu_metrics_provider.h
  39. daily_event.cc
  40. daily_event.h
  41. daily_event_unittest.cc
  42. data_use_tracker.cc
  43. data_use_tracker.h
  44. data_use_tracker_unittest.cc
  45. date_changed_helper.cc
  46. date_changed_helper.h
  47. date_changed_helper_unittest.cc
  48. delegating_provider.cc
  49. delegating_provider.h
  50. DEPS
  51. DIR_METADATA
  52. drive_metrics_provider.cc
  53. drive_metrics_provider.h
  54. enabled_state_provider.cc
  55. enabled_state_provider.h
  56. entropy_state.cc
  57. entropy_state.h
  58. entropy_state_provider.cc
  59. entropy_state_provider.h
  60. entropy_state_provider_unittest.cc
  61. entropy_state_unittest.cc
  62. environment_recorder.cc
  63. environment_recorder.h
  64. environment_recorder_unittest.cc
  65. expired_histogram_util.cc
  66. expired_histogram_util.h
  67. expired_histograms_checker.cc
  68. expired_histograms_checker.h
  69. expired_histograms_checker_unittest.cc
  70. field_trials_provider.cc
  71. field_trials_provider.h
  72. field_trials_provider_unittest.cc
  73. file_metrics_provider.cc
  74. file_metrics_provider.h
  75. file_metrics_provider_unittest.cc
  76. fre_source_trial.cc
  77. fre_source_trial.h
  78. generate_expired_histograms_array.gni
  79. gms_metrics_provider.cc
  80. gms_metrics_provider.h
  81. gms_metrics_provider_unittest.cc
  82. histogram_child_process.h
  83. histogram_controller.cc
  84. histogram_controller.h
  85. histogram_encoder.cc
  86. histogram_encoder.h
  87. histogram_encoder_unittest.cc
  88. histogram_subscriber.h
  89. install_date_provider.cc
  90. install_date_provider.h
  91. log_decoder.cc
  92. log_decoder.h
  93. log_decoder_unittest.cc
  94. log_store.h
  95. machine_id_provider.h
  96. machine_id_provider_nonwin.cc
  97. machine_id_provider_nonwin_unittest.cc
  98. machine_id_provider_win.cc
  99. machine_id_provider_win_unittest.cc
  100. metrics_data_validation.cc
  101. metrics_data_validation.h
  102. metrics_data_validation_unittest.cc
  103. metrics_features.cc
  104. metrics_features.h
  105. metrics_log.cc
  106. metrics_log.h
  107. metrics_log_store.cc
  108. metrics_log_store.h
  109. metrics_log_store_unittest.cc
  110. metrics_log_unittest.cc
  111. metrics_log_uploader.h
  112. metrics_logs_event_manager.cc
  113. metrics_logs_event_manager.h
  114. metrics_pref_names.h
  115. metrics_provider.cc
  116. metrics_provider.h
  117. metrics_reporting_default_state.cc
  118. metrics_reporting_default_state.h
  119. metrics_reporting_service.cc
  120. metrics_reporting_service.h
  121. metrics_rotation_scheduler.cc
  122. metrics_rotation_scheduler.h
  123. metrics_scheduler.cc
  124. metrics_scheduler.h
  125. metrics_service.cc
  126. metrics_service.h
  127. metrics_service_accessor.cc
  128. metrics_service_accessor.h
  129. metrics_service_client.cc
  130. metrics_service_client.h
  131. metrics_service_client_unittest.cc
  132. metrics_service_observer.cc
  133. metrics_service_observer.h
  134. metrics_service_observer_unittest.cc
  135. metrics_service_unittest.cc
  136. metrics_shutdown.cc
  137. metrics_shutdown.h
  138. metrics_state_manager.cc
  139. metrics_state_manager.h
  140. metrics_state_manager_unittest.cc
  141. metrics_switches.cc
  142. metrics_switches.h
  143. metrics_upload_scheduler.cc
  144. metrics_upload_scheduler.h
  145. motherboard.cc
  146. motherboard.h
  147. motherboard_metrics_provider.cc
  148. motherboard_metrics_provider.h
  149. motherboard_metrics_provider_unittest.cc
  150. OWNERS
  151. persistent_histograms.cc
  152. persistent_histograms.h
  153. persistent_synthetic_trial_observer.cc
  154. persistent_synthetic_trial_observer.h
  155. persistent_synthetic_trial_observer_unittest.cc
  156. persistent_system_profile.cc
  157. persistent_system_profile.h
  158. persistent_system_profile_unittest.cc
  159. README
  160. reporting_service.cc
  161. reporting_service.h
  162. reporting_service_unittest.cc
  163. sampling_metrics_provider.cc
  164. sampling_metrics_provider.h
  165. server_urls.cc
  166. server_urls.grd
  167. server_urls.h
  168. server_urls_unittest.cc
  169. single_sample_metrics.cc
  170. single_sample_metrics.h
  171. single_sample_metrics_factory_impl.cc
  172. single_sample_metrics_factory_impl.h
  173. single_sample_metrics_factory_impl_unittest.cc
  174. stability_metrics_helper.cc
  175. stability_metrics_helper.h
  176. stability_metrics_helper_unittest.cc
  177. stability_metrics_provider.cc
  178. stability_metrics_provider.h
  179. stability_metrics_provider_unittest.cc
  180. ukm_demographic_metrics_provider.h
  181. unsent_log_store.cc
  182. unsent_log_store.h
  183. unsent_log_store_metrics.cc
  184. unsent_log_store_metrics.h
  185. unsent_log_store_metrics_impl.cc
  186. unsent_log_store_metrics_impl.h
  187. unsent_log_store_metrics_impl_unittest.cc
  188. unsent_log_store_unittest.cc
  189. version_utils.cc
  190. version_utils.h