Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(350)

Side by Side Diff: chrome/browser/sessions/session_service.cc

Issue 500143002: Fixes possible use after free in SessionService (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove friend Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sessions/session_service.h" 5 #include "chrome/browser/sessions/session_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 227
228 // SessionService ------------------------------------------------------------- 228 // SessionService -------------------------------------------------------------
229 229
230 SessionService::SessionService(Profile* profile) 230 SessionService::SessionService(Profile* profile)
231 : BaseSessionService(SESSION_RESTORE, profile, base::FilePath()), 231 : BaseSessionService(SESSION_RESTORE, profile, base::FilePath()),
232 has_open_trackable_browsers_(false), 232 has_open_trackable_browsers_(false),
233 move_on_new_browser_(false), 233 move_on_new_browser_(false),
234 save_delay_in_millis_(base::TimeDelta::FromMilliseconds(2500)), 234 save_delay_in_millis_(base::TimeDelta::FromMilliseconds(2500)),
235 save_delay_in_mins_(base::TimeDelta::FromMinutes(10)), 235 save_delay_in_mins_(base::TimeDelta::FromMinutes(10)),
236 save_delay_in_hrs_(base::TimeDelta::FromHours(8)), 236 save_delay_in_hrs_(base::TimeDelta::FromHours(8)),
237 force_browser_not_alive_with_no_windows_(false) { 237 force_browser_not_alive_with_no_windows_(false),
238 weak_factory_(this) {
238 Init(); 239 Init();
239 } 240 }
240 241
241 SessionService::SessionService(const base::FilePath& save_path) 242 SessionService::SessionService(const base::FilePath& save_path)
242 : BaseSessionService(SESSION_RESTORE, NULL, save_path), 243 : BaseSessionService(SESSION_RESTORE, NULL, save_path),
243 has_open_trackable_browsers_(false), 244 has_open_trackable_browsers_(false),
244 move_on_new_browser_(false), 245 move_on_new_browser_(false),
245 save_delay_in_millis_(base::TimeDelta::FromMilliseconds(2500)), 246 save_delay_in_millis_(base::TimeDelta::FromMilliseconds(2500)),
246 save_delay_in_mins_(base::TimeDelta::FromMinutes(10)), 247 save_delay_in_mins_(base::TimeDelta::FromMinutes(10)),
247 save_delay_in_hrs_(base::TimeDelta::FromHours(8)), 248 save_delay_in_hrs_(base::TimeDelta::FromHours(8)),
248 force_browser_not_alive_with_no_windows_(false) { 249 force_browser_not_alive_with_no_windows_(false),
250 weak_factory_(this) {
249 Init(); 251 Init();
250 } 252 }
251 253
252 SessionService::~SessionService() { 254 SessionService::~SessionService() {
253 // The BrowserList should outlive the SessionService since it's static and 255 // The BrowserList should outlive the SessionService since it's static and
254 // the SessionService is a KeyedService. 256 // the SessionService is a KeyedService.
255 BrowserList::RemoveObserver(this); 257 BrowserList::RemoveObserver(this);
256 Save(); 258 Save();
257 } 259 }
258 260
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 kCommandSetTabUserAgentOverride, tab_id.id(), user_agent_override)); 566 kCommandSetTabUserAgentOverride, tab_id.id(), user_agent_override));
565 } 567 }
566 568
567 base::CancelableTaskTracker::TaskId SessionService::GetLastSession( 569 base::CancelableTaskTracker::TaskId SessionService::GetLastSession(
568 const SessionCallback& callback, 570 const SessionCallback& callback,
569 base::CancelableTaskTracker* tracker) { 571 base::CancelableTaskTracker* tracker) {
570 // OnGotSessionCommands maps the SessionCommands to browser state, then run 572 // OnGotSessionCommands maps the SessionCommands to browser state, then run
571 // the callback. 573 // the callback.
572 return ScheduleGetLastSessionCommands( 574 return ScheduleGetLastSessionCommands(
573 base::Bind(&SessionService::OnGotSessionCommands, 575 base::Bind(&SessionService::OnGotSessionCommands,
574 base::Unretained(this), callback), 576 weak_factory_.GetWeakPtr(), callback),
575 tracker); 577 tracker);
576 } 578 }
577 579
578 void SessionService::Save() { 580 void SessionService::Save() {
579 bool had_commands = !pending_commands().empty(); 581 bool had_commands = !pending_commands().empty();
580 BaseSessionService::Save(); 582 BaseSessionService::Save();
581 if (had_commands) { 583 if (had_commands) {
582 RecordSessionUpdateHistogramData(chrome::NOTIFICATION_SESSION_SERVICE_SAVED, 584 RecordSessionUpdateHistogramData(chrome::NOTIFICATION_SESSION_SERVICE_SAVED,
583 &last_updated_save_time_); 585 &last_updated_save_time_);
584 content::NotificationService::current()->Notify( 586 content::NotificationService::current()->Notify(
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1847 return; 1849 return;
1848 } 1850 }
1849 1851
1850 // Check for any open windows for the current profile that we aren't tracking. 1852 // Check for any open windows for the current profile that we aren't tracking.
1851 for (chrome::BrowserIterator it; !it.done(); it.Next()) { 1853 for (chrome::BrowserIterator it; !it.done(); it.Next()) {
1852 if ((*it)->profile() == profile()) 1854 if ((*it)->profile() == profile())
1853 return; 1855 return;
1854 } 1856 }
1855 DeleteSessionOnlyData(profile()); 1857 DeleteSessionOnlyData(profile());
1856 } 1858 }
OLDNEW
« no previous file with comments | « chrome/browser/sessions/session_service.h ('k') | chrome/browser/sessions/session_service_test_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698