Commit cfb5b9cc authored by Rohit Rao's avatar Rohit Rao Committed by Commit Bot

[ios] Fixes a shutdown crash when Omaha is not initialized.

M84 is crashing because OmahaService::Stop() is somehow called before
the OmahaService singleton is created. This causes Stop() to try and
create a new service object during shutdown, which crashes.

This CL sidesteps the crash by making it safe to create a new
OmahaService object, even at shutdown. The unsafe portions of the
constructor were already in StartInternal(), which now needs to be
explicitly invoked by OmahaService::Start().

BUG=1105799

Change-Id: Idd9531ab0ac79e4520deaa2145e9d3efc20bb01d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2339719Reviewed-by: default avatarSylvain Defresne <sdefresne@chromium.org>
Commit-Queue: Rohit Rao <rohitrao@chromium.org>
Cr-Commit-Position: refs/heads/master@{#795980}
parent 9a36fa99
...@@ -172,6 +172,9 @@ class OmahaService { ...@@ -172,6 +172,9 @@ class OmahaService {
pending_url_loader_factory_; pending_url_loader_factory_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
// Whether the service has been started.
bool started_;
// The timer that call this object back when needed. // The timer that call this object back when needed.
base::OneShotTimer timer_; base::OneShotTimer timer_;
......
...@@ -332,6 +332,8 @@ void OmahaService::Start(std::unique_ptr<network::PendingSharedURLLoaderFactory> ...@@ -332,6 +332,8 @@ void OmahaService::Start(std::unique_ptr<network::PendingSharedURLLoaderFactory>
} }
OmahaService* service = GetInstance(); OmahaService* service = GetInstance();
service->StartInternal();
service->set_upgrade_recommended_callback(callback); service->set_upgrade_recommended_callback(callback);
// This should only be called once. // This should only be called once.
DCHECK(!service->pending_url_loader_factory_ || DCHECK(!service->pending_url_loader_factory_ ||
...@@ -353,23 +355,22 @@ void OmahaService::Stop() { ...@@ -353,23 +355,22 @@ void OmahaService::Stop() {
service->StopInternal(); service->StopInternal();
} }
OmahaService::OmahaService() OmahaService::OmahaService() : OmahaService(/*schedule=*/true) {}
: schedule_(true),
application_install_date_(0),
sending_install_event_(false) {
StartInternal();
}
OmahaService::OmahaService(bool schedule) OmahaService::OmahaService(bool schedule)
: schedule_(schedule), : started_(false),
schedule_(schedule),
application_install_date_(0), application_install_date_(0),
sending_install_event_(false) { sending_install_event_(false) {}
StartInternal();
}
OmahaService::~OmahaService() {} OmahaService::~OmahaService() {}
void OmahaService::StartInternal() { void OmahaService::StartInternal() {
if (started_) {
return;
}
started_ = true;
// Start the provider at the same time as the rest of the service. // Start the provider at the same time as the rest of the service.
ios::GetChromeBrowserProvider()->GetOmahaServiceProvider()->Start(); ios::GetChromeBrowserProvider()->GetOmahaServiceProvider()->Start();
...@@ -432,6 +433,10 @@ void OmahaService::StartInternal() { ...@@ -432,6 +433,10 @@ void OmahaService::StartInternal() {
} }
void OmahaService::StopInternal() { void OmahaService::StopInternal() {
if (!started_) {
return;
}
ios::GetChromeBrowserProvider()->GetOmahaServiceProvider()->Stop(); ios::GetChromeBrowserProvider()->GetOmahaServiceProvider()->Stop();
} }
......
...@@ -115,6 +115,8 @@ TEST_F(OmahaServiceTest, PingMessageTest) { ...@@ -115,6 +115,8 @@ TEST_F(OmahaServiceTest, PingMessageTest) {
"<ping active=\"1\" ad=\"-2\" rd=\"-2\"/></app></request>"; "<ping active=\"1\" ad=\"-2\" rd=\"-2\"/></app></request>";
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
std::string content = service.GetPingContent( std::string content = service.GetPingContent(
...@@ -141,6 +143,8 @@ TEST_F(OmahaServiceTest, PingMessageTestWithUnknownInstallDate) { ...@@ -141,6 +143,8 @@ TEST_F(OmahaServiceTest, PingMessageTestWithUnknownInstallDate) {
"<ping active=\"1\" ad=\"-2\" rd=\"-2\"/></app></request>"; "<ping active=\"1\" ad=\"-2\" rd=\"-2\"/></app></request>";
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
std::string content = service.GetPingContent( std::string content = service.GetPingContent(
...@@ -171,6 +175,8 @@ TEST_F(OmahaServiceTest, InstallEventMessageTest) { ...@@ -171,6 +175,8 @@ TEST_F(OmahaServiceTest, InstallEventMessageTest) {
// First install. // First install.
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
CleanService(&service, ""); CleanService(&service, "");
...@@ -207,6 +213,8 @@ TEST_F(OmahaServiceTest, InstallEventMessageTest) { ...@@ -207,6 +213,8 @@ TEST_F(OmahaServiceTest, InstallEventMessageTest) {
TEST_F(OmahaServiceTest, SendPingSuccess) { TEST_F(OmahaServiceTest, SendPingSuccess) {
base::Time now = base::Time::Now(); base::Time now = base::Time::Now();
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.InitializeURLLoaderFactory(test_shared_url_loader_factory_); service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
...@@ -241,6 +249,8 @@ TEST_F(OmahaServiceTest, SendPingSuccess) { ...@@ -241,6 +249,8 @@ TEST_F(OmahaServiceTest, SendPingSuccess) {
TEST_F(OmahaServiceTest, ParseAndEchoLastServerDate) { TEST_F(OmahaServiceTest, ParseAndEchoLastServerDate) {
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.InitializeURLLoaderFactory(test_shared_url_loader_factory_); service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
...@@ -288,6 +298,8 @@ TEST_F(OmahaServiceTest, ParseAndEchoLastServerDate) { ...@@ -288,6 +298,8 @@ TEST_F(OmahaServiceTest, ParseAndEchoLastServerDate) {
TEST_F(OmahaServiceTest, SendInstallEventSuccess) { TEST_F(OmahaServiceTest, SendInstallEventSuccess) {
base::Time now = base::Time::Now(); base::Time now = base::Time::Now();
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.InitializeURLLoaderFactory(test_shared_url_loader_factory_); service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
...@@ -320,6 +332,8 @@ TEST_F(OmahaServiceTest, SendInstallEventSuccess) { ...@@ -320,6 +332,8 @@ TEST_F(OmahaServiceTest, SendInstallEventSuccess) {
TEST_F(OmahaServiceTest, SendPingReceiveUpdate) { TEST_F(OmahaServiceTest, SendPingReceiveUpdate) {
base::Time now = base::Time::Now(); base::Time now = base::Time::Now();
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.InitializeURLLoaderFactory(test_shared_url_loader_factory_); service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
...@@ -365,6 +379,8 @@ TEST_F(OmahaServiceTest, SendPingReceiveUpdate) { ...@@ -365,6 +379,8 @@ TEST_F(OmahaServiceTest, SendPingReceiveUpdate) {
TEST_F(OmahaServiceTest, SendPingFailure) { TEST_F(OmahaServiceTest, SendPingFailure) {
base::Time now = base::Time::Now(); base::Time now = base::Time::Now();
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.InitializeURLLoaderFactory(test_shared_url_loader_factory_); service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
...@@ -416,6 +432,8 @@ TEST_F(OmahaServiceTest, PersistStatesTest) { ...@@ -416,6 +432,8 @@ TEST_F(OmahaServiceTest, PersistStatesTest) {
std::string version_string = version_info::GetVersionNumber(); std::string version_string = version_info::GetVersionNumber();
base::Time now = base::Time::Now(); base::Time now = base::Time::Now();
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.number_of_tries_ = 5; service.number_of_tries_ = 5;
...@@ -426,6 +444,8 @@ TEST_F(OmahaServiceTest, PersistStatesTest) { ...@@ -426,6 +444,8 @@ TEST_F(OmahaServiceTest, PersistStatesTest) {
service.PersistStates(); service.PersistStates();
OmahaService service2(false); OmahaService service2(false);
service2.StartInternal();
EXPECT_EQ(service.number_of_tries_, 5); EXPECT_EQ(service.number_of_tries_, 5);
EXPECT_EQ(service2.last_sent_time_, now - base::TimeDelta::FromSeconds(1)); EXPECT_EQ(service2.last_sent_time_, now - base::TimeDelta::FromSeconds(1));
EXPECT_EQ(service2.next_tries_time_, now + base::TimeDelta::FromSeconds(2)); EXPECT_EQ(service2.next_tries_time_, now + base::TimeDelta::FromSeconds(2));
...@@ -449,6 +469,8 @@ TEST_F(OmahaServiceTest, BackoffTest) { ...@@ -449,6 +469,8 @@ TEST_F(OmahaServiceTest, BackoffTest) {
TEST_F(OmahaServiceTest, ActivePingAfterInstallEventTest) { TEST_F(OmahaServiceTest, ActivePingAfterInstallEventTest) {
base::Time now = base::Time::Now(); base::Time now = base::Time::Now();
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.InitializeURLLoaderFactory(test_shared_url_loader_factory_); service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
...@@ -483,6 +505,8 @@ TEST_F(OmahaServiceTest, ActivePingAfterInstallEventTest) { ...@@ -483,6 +505,8 @@ TEST_F(OmahaServiceTest, ActivePingAfterInstallEventTest) {
TEST_F(OmahaServiceTest, NonSpammingTest) { TEST_F(OmahaServiceTest, NonSpammingTest) {
base::Time now = base::Time::Now(); base::Time now = base::Time::Now();
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.InitializeURLLoaderFactory(test_shared_url_loader_factory_); service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
...@@ -516,6 +540,8 @@ TEST_F(OmahaServiceTest, NonSpammingTest) { ...@@ -516,6 +540,8 @@ TEST_F(OmahaServiceTest, NonSpammingTest) {
TEST_F(OmahaServiceTest, InstallRetryTest) { TEST_F(OmahaServiceTest, InstallRetryTest) {
OmahaService service(false); OmahaService service(false);
service.StartInternal();
service.set_upgrade_recommended_callback( service.set_upgrade_recommended_callback(
base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this))); base::Bind(&OmahaServiceTest::OnNeedUpdate, base::Unretained(this)));
service.InitializeURLLoaderFactory(test_shared_url_loader_factory_); service.InitializeURLLoaderFactory(test_shared_url_loader_factory_);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment