diff options
author | zea <zea@chromium.org> | 2015-09-23 16:26:50 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-23 23:27:32 +0000 |
commit | b388c75b293fb4b0ae394ff75683416aa0a8c5ab (patch) | |
tree | 0adb47056b8ef58b46fa9f767c2c937eb86edd14 /google_apis | |
parent | 90e01f99ec58a64e339a2d87983f0fdd7fb4bde1 (diff) | |
download | chromium_src-b388c75b293fb4b0ae394ff75683416aa0a8c5ab.zip chromium_src-b388c75b293fb4b0ae394ff75683416aa0a8c5ab.tar.gz chromium_src-b388c75b293fb4b0ae394ff75683416aa0a8c5ab.tar.bz2 |
[GCM] Fix crash in heartbeat manager
If the power monitor triggers notifies the manager before it gets started,
we might attempt to invoke a null callback.
BUG=535182
Review URL: https://codereview.chromium.org/1364023002
Cr-Commit-Position: refs/heads/master@{#350385}
Diffstat (limited to 'google_apis')
-rw-r--r-- | google_apis/gcm/engine/heartbeat_manager.cc | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/google_apis/gcm/engine/heartbeat_manager.cc b/google_apis/gcm/engine/heartbeat_manager.cc index 9875912..0e78b02 100644 --- a/google_apis/gcm/engine/heartbeat_manager.cc +++ b/google_apis/gcm/engine/heartbeat_manager.cc @@ -46,10 +46,6 @@ HeartbeatManager::HeartbeatManager() heartbeat_timer_(new base::Timer(true /* retain_user_task */, false /* is_repeating */)), weak_ptr_factory_(this) { - // Listen for system suspend and resume events. - base::PowerMonitor* monitor = base::PowerMonitor::Get(); - if (monitor) - monitor->AddObserver(this); } HeartbeatManager::~HeartbeatManager() { @@ -67,6 +63,11 @@ void HeartbeatManager::Start( send_heartbeat_callback_ = send_heartbeat_callback; trigger_reconnect_callback_ = trigger_reconnect_callback; + // Listen for system suspend and resume events. + base::PowerMonitor* monitor = base::PowerMonitor::Get(); + if (monitor) + monitor->AddObserver(this); + // Kicks off the timer. waiting_for_ack_ = false; RestartTimer(); @@ -77,6 +78,10 @@ void HeartbeatManager::Stop() { heartbeat_interval_ms_ = 0; heartbeat_timer_->Stop(); waiting_for_ack_ = false; + + base::PowerMonitor* monitor = base::PowerMonitor::Get(); + if (monitor) + monitor->RemoveObserver(this); } void HeartbeatManager::OnHeartbeatAcked() { @@ -135,7 +140,10 @@ void HeartbeatManager::OnResume() { // Make sure a minimum amount of time has passed before forcing a heartbeat to // avoid any tight loop scenarios. - if (elapsed > base::TimeDelta::FromMilliseconds(kMinSuspendTimeMs)) + // If the |send_heartbeat_callback_| is null, it means the heartbeat manager + // hasn't been started, so do nothing. + if (elapsed > base::TimeDelta::FromMilliseconds(kMinSuspendTimeMs) && + !send_heartbeat_callback_.is_null()) OnHeartbeatTriggered(); } |