Fix certificate checker callback lifetime.
OpenSSL's SSL_CTX_set_verify() function allows us to set a callback
called after certificate validation but doesn't provide a way to pass
private data to this callback. CL:183832 was passing the pointer to the
CertificateChecker instance using a global pointer, nevertheless the
lifetime of this pointer was wrong since libcurl can trigger this
callback asynchronously when the SSL certificates are downloaded.
This patch converts the CertificateChecker into a singleton class and
uses the same trick previously used to pass the ServerToCheck value
using different callbacks.
Bug: 25818567
Test: Run an update on edison-userdebug; FEATURES=test emerge-link update_engine
Change-Id: I84cdb2f8c5ac86d1463634e73e867f213f7a2f5a
diff --git a/update_attempter_unittest.cc b/update_attempter_unittest.cc
index 317f0ca..747a974 100644
--- a/update_attempter_unittest.cc
+++ b/update_attempter_unittest.cc
@@ -83,7 +83,7 @@
UpdateAttempterUnderTest(SystemState* system_state,
LibCrosProxy* libcros_proxy,
org::chromium::debugdProxyInterface* debugd_proxy)
- : UpdateAttempter(system_state, libcros_proxy, debugd_proxy) {}
+ : UpdateAttempter(system_state, nullptr, libcros_proxy, debugd_proxy) {}
// Wrap the update scheduling method, allowing us to opt out of scheduled
// updates for testing purposes.
@@ -117,12 +117,16 @@
new NiceMock<UpdateEngineLibcrosProxyResolvedInterfaceProxyMock>()),
libcros_proxy_(
brillo::make_unique_ptr(service_interface_mock_),
- brillo::make_unique_ptr(ue_proxy_resolved_interface_mock_)) {
+ brillo::make_unique_ptr(ue_proxy_resolved_interface_mock_)),
+ certificate_checker_(fake_system_state_.mock_prefs(),
+ &openssl_wrapper_) {
// Override system state members.
fake_system_state_.set_connection_manager(&mock_connection_manager);
fake_system_state_.set_update_attempter(&attempter_);
loop_.SetAsCurrent();
+ certificate_checker_.Init();
+
// Finish initializing the attempter.
attempter_.Init();
}
@@ -199,6 +203,8 @@
UpdateEngineLibcrosProxyResolvedInterfaceProxyMock*
ue_proxy_resolved_interface_mock_;
LibCrosProxy libcros_proxy_;
+ OpenSSLWrapper openssl_wrapper_;
+ CertificateChecker certificate_checker_;
UpdateAttempterUnderTest attempter_{&fake_system_state_,
&libcros_proxy_,
&debugd_proxy_mock_};