MultiRangeHttpFetcher::ReceivedBytes should signal the caller correctly.

HttpFetcherDelegate::ReceivedBytes requires a delegate to return false
to signal the caller to terminate. However, the overload in
MultiRangeHttpFetcher::ReceivedBytes missed that and wrongly returned
true instead.

As a result, we observed the following crash while running an ASAN
build.

FileFetcher::OnReadDoneCallback()
  |
  | called its delegate of MultiRangeHttpFetcher
  |
  -- MultiRangeHttpFetcher::ReceivedBytes()
      |
      | requested fetchers to terminate
      |
      -- fetcher->TerminateTransfer()
          |
          |-- MultiRangeHttpFetcher::TerminateTransfer()
                |
                -- FileFetcher::TerminateTransfer()
                     |
                     -- MultiRangeHttpFetcher::TransferTerminated()
                          |
                          |-- DownloadAction::TransferTerminated()
                                |
                                |-- ActionProcessor::ActionComplete()
                                |
                                | DownloadAction / MultiRangeHttpFetcher /
                                | FileFetcher all destroyed
      |
      | (but it didn't signal the caller to terminate)
  |
  | FileFetcher proceeded to call FileFetcher::ScheduleRead() that accessed
  | already freed memory

While fixing the above issue, a separate bug in
LibcurlHttpFetcher::LibcurlWrite was uncovered, where in_write_callback_
wasn't properly reset.

Bug: 120577143
Test: Build and flash an ASAN build on taimen. Applying a payload with
      file:// no longer crashes with tag-mismatch.
Test: Run update_engine_unittests.
Change-Id: I66c862ae40accbfaddc41fb8590b152c2169eea6
2 files changed
tree: 8b507f844b4468c28e9d48a9d95cb70e4e6a682f
  1. binder_bindings/
  2. client_library/
  3. common/
  4. dbus_bindings/
  5. init/
  6. payload_consumer/
  7. payload_generator/
  8. sample_images/
  9. scripts/
  10. update_engine/
  11. update_manager/
  12. update_payload_key/
  13. .clang-format
  14. .gitignore
  15. Android.bp
  16. binder_service_android.cc
  17. binder_service_android.h
  18. binder_service_brillo.cc
  19. binder_service_brillo.h
  20. boot_control_android.cc
  21. boot_control_android.h
  22. boot_control_android_unittest.cc
  23. boot_control_chromeos.cc
  24. boot_control_chromeos.h
  25. boot_control_chromeos_unittest.cc
  26. certificate_checker.cc
  27. certificate_checker.h
  28. certificate_checker_unittest.cc
  29. chrome_browser_proxy_resolver.cc
  30. chrome_browser_proxy_resolver.h
  31. COMMIT-QUEUE.ini
  32. common_service.cc
  33. common_service.h
  34. common_service_unittest.cc
  35. connection_manager.cc
  36. connection_manager.h
  37. connection_manager_android.cc
  38. connection_manager_android.h
  39. connection_manager_interface.h
  40. connection_manager_unittest.cc
  41. connection_utils.cc
  42. connection_utils.h
  43. CPPLINT.cfg
  44. daemon.cc
  45. daemon.h
  46. daemon_state_android.cc
  47. daemon_state_android.h
  48. daemon_state_interface.h
  49. dbus_connection.cc
  50. dbus_connection.h
  51. dbus_service.cc
  52. dbus_service.h
  53. dbus_test_utils.h
  54. dynamic_partition_control_android.cc
  55. dynamic_partition_control_android.h
  56. dynamic_partition_control_interface.h
  57. fake_file_writer.h
  58. fake_p2p_manager.h
  59. fake_p2p_manager_configuration.h
  60. fake_shill_proxy.cc
  61. fake_shill_proxy.h
  62. fake_system_state.cc
  63. fake_system_state.h
  64. generate_pc_file.sh
  65. hardware_android.cc
  66. hardware_android.h
  67. hardware_chromeos.cc
  68. hardware_chromeos.h
  69. hardware_chromeos_unittest.cc
  70. image_properties.h
  71. image_properties_android.cc
  72. image_properties_android_unittest.cc
  73. image_properties_chromeos.cc
  74. image_properties_chromeos_unittest.cc
  75. libcurl_http_fetcher.cc
  76. libcurl_http_fetcher.h
  77. libupdate_engine-client-test.pc.in
  78. libupdate_engine-client.pc.in
  79. local_coverage_rate
  80. main.cc
  81. metrics_constants.h
  82. metrics_reporter_android.cc
  83. metrics_reporter_android.h
  84. metrics_reporter_interface.h
  85. metrics_reporter_omaha.cc
  86. metrics_reporter_omaha.h
  87. metrics_reporter_omaha_unittest.cc
  88. metrics_reporter_stub.cc
  89. metrics_reporter_stub.h
  90. metrics_utils.cc
  91. metrics_utils.h
  92. metrics_utils_unittest.cc
  93. mock_boot_control_hal.h
  94. mock_certificate_checker.h
  95. mock_connection_manager.h
  96. mock_dynamic_partition_control.h
  97. mock_file_writer.h
  98. mock_metrics_reporter.h
  99. mock_omaha_request_params.h
  100. mock_p2p_manager.h
  101. mock_payload_state.h
  102. mock_power_manager.h
  103. mock_service_observer.h
  104. mock_update_attempter.h
  105. MODULE_LICENSE_APACHE2
  106. network_selector.h
  107. network_selector_android.cc
  108. network_selector_android.h
  109. network_selector_interface.h
  110. network_selector_stub.cc
  111. network_selector_stub.h
  112. NOTICE
  113. omaha_request_action.cc
  114. omaha_request_action.h
  115. omaha_request_action_unittest.cc
  116. omaha_request_params.cc
  117. omaha_request_params.h
  118. omaha_request_params_unittest.cc
  119. omaha_response.h
  120. omaha_response_handler_action.cc
  121. omaha_response_handler_action.h
  122. omaha_response_handler_action_unittest.cc
  123. omaha_utils.cc
  124. omaha_utils.h
  125. omaha_utils_unittest.cc
  126. OWNERS
  127. p2p_manager.cc
  128. p2p_manager.h
  129. p2p_manager_unittest.cc
  130. parcelable_update_engine_status.cc
  131. parcelable_update_engine_status.h
  132. parcelable_update_engine_status_unittest.cc
  133. payload_state.cc
  134. payload_state.h
  135. payload_state_interface.h
  136. payload_state_unittest.cc
  137. power_manager_android.cc
  138. power_manager_android.h
  139. power_manager_chromeos.cc
  140. power_manager_chromeos.h
  141. power_manager_interface.h
  142. PRESUBMIT.cfg
  143. PREUPLOAD.cfg
  144. pylintrc
  145. real_system_state.cc
  146. real_system_state.h
  147. run_unittests
  148. sample_omaha_v3_response.xml
  149. service_delegate_android_interface.h
  150. service_observer_interface.h
  151. shill_proxy.cc
  152. shill_proxy.h
  153. shill_proxy_interface.h
  154. sideload_main.cc
  155. system_state.h
  156. tar_bunzip2.gypi
  157. test_http_server.cc
  158. test_subprocess.cc
  159. testrunner.cc
  160. unittest_key.pem
  161. unittest_key2.pem
  162. update_attempter.cc
  163. update_attempter.h
  164. update_attempter_android.cc
  165. update_attempter_android.h
  166. update_attempter_android_unittest.cc
  167. update_attempter_unittest.cc
  168. update_boot_flags_action.cc
  169. update_boot_flags_action.h
  170. update_boot_flags_action_unittest.cc
  171. update_engine-client.gyp
  172. update_engine.conf
  173. update_engine.gyp
  174. update_engine.rc
  175. update_engine_client.cc
  176. update_engine_client_android.cc
  177. update_metadata.proto
  178. update_status_utils.cc
  179. update_status_utils.h
  180. UpdateEngine.conf