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

Side by Side Diff: chrome/browser/sync/sessions/sessions_sync_manager.cc

Issue 495593003: Avoid memory corruption in sessions sync (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/sync/sessions/sessions_sync_manager.h" 5 #include "chrome/browser/sync/sessions/sessions_sync_manager.h"
6 6
7 #include "chrome/browser/chrome_notification_types.h" 7 #include "chrome/browser/chrome_notification_types.h"
8 #include "chrome/browser/profiles/profile.h" 8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/sync/glue/local_device_info_provider.h" 9 #include "chrome/browser/sync/glue/local_device_info_provider.h"
10 #include "chrome/browser/sync/glue/synced_tab_delegate.h" 10 #include "chrome/browser/sync/glue/synced_tab_delegate.h"
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 syncer::SyncDataList data( 331 syncer::SyncDataList data(
332 sync_processor_->GetAllSyncData(syncer::SESSIONS)); 332 sync_processor_->GetAllSyncData(syncer::SESSIONS));
333 scoped_ptr<syncer::SyncErrorFactory> error_handler(error_handler_.Pass()); 333 scoped_ptr<syncer::SyncErrorFactory> error_handler(error_handler_.Pass());
334 scoped_ptr<syncer::SyncChangeProcessor> processor(sync_processor_.Pass()); 334 scoped_ptr<syncer::SyncChangeProcessor> processor(sync_processor_.Pass());
335 335
336 StopSyncing(syncer::SESSIONS); 336 StopSyncing(syncer::SESSIONS);
337 MergeDataAndStartSyncing( 337 MergeDataAndStartSyncing(
338 syncer::SESSIONS, data, processor.Pass(), error_handler.Pass()); 338 syncer::SESSIONS, data, processor.Pass(), error_handler.Pass());
339 } 339 }
340 340
341 bool SessionsSyncManager::IsValidSessionHeader(
342 const sync_pb::SessionHeader& header) {
343 // Verify that tab IDs appear only once within a session.
344 // Intended to prevent http://crbug.com/360822.
345 std::set<int> session_tab_ids;
346 for (int i = 0; i < header.window_size(); ++i) {
347 const sync_pb::SessionWindow& window = header.window(i);
348 for (int j = 0; j < window.tab_size(); ++j) {
349 const int tab_id = window.tab(j);
350 bool success = session_tab_ids.insert(tab_id).second;
351 if (!success)
352 return false;
353 }
354 }
355
356 return true;
357 }
358
341 void SessionsSyncManager::OnLocalTabModified(SyncedTabDelegate* modified_tab) { 359 void SessionsSyncManager::OnLocalTabModified(SyncedTabDelegate* modified_tab) {
342 const content::NavigationEntry* entry = modified_tab->GetActiveEntry(); 360 const content::NavigationEntry* entry = modified_tab->GetActiveEntry();
343 if (!modified_tab->IsBeingDestroyed() && 361 if (!modified_tab->IsBeingDestroyed() &&
344 entry && 362 entry &&
345 entry->GetVirtualURL().is_valid() && 363 entry->GetVirtualURL().is_valid() &&
346 entry->GetVirtualURL().spec() == kNTPOpenTabSyncURL) { 364 entry->GetVirtualURL().spec() == kNTPOpenTabSyncURL) {
347 DVLOG(1) << "Triggering sync refresh for sessions datatype."; 365 DVLOG(1) << "Triggering sync refresh for sessions datatype.";
348 const syncer::ModelTypeSet types(syncer::SESSIONS); 366 const syncer::ModelTypeSet types(syncer::SESSIONS);
349 content::NotificationService::current()->Notify( 367 content::NotificationService::current()->Notify(
350 chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, 368 chrome::NOTIFICATION_SYNC_REFRESH_LOCAL,
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 std::string foreign_session_tag = specifics.session_tag(); 600 std::string foreign_session_tag = specifics.session_tag();
583 DCHECK_NE(foreign_session_tag, current_machine_tag()); 601 DCHECK_NE(foreign_session_tag, current_machine_tag());
584 602
585 SyncedSession* foreign_session = 603 SyncedSession* foreign_session =
586 session_tracker_.GetSession(foreign_session_tag); 604 session_tracker_.GetSession(foreign_session_tag);
587 if (specifics.has_header()) { 605 if (specifics.has_header()) {
588 // Read in the header data for this foreign session. 606 // Read in the header data for this foreign session.
589 // Header data contains window information and ordered tab id's for each 607 // Header data contains window information and ordered tab id's for each
590 // window. 608 // window.
591 609
610 if (!IsValidSessionHeader(specifics.header())) {
611 LOG(WARNING) << "Ignoring foreign session node with invalid header "
612 << "and tag " << foreign_session_tag << ".";
613 return;
614 }
615
592 // Load (or create) the SyncedSession object for this client. 616 // Load (or create) the SyncedSession object for this client.
593 const sync_pb::SessionHeader& header = specifics.header(); 617 const sync_pb::SessionHeader& header = specifics.header();
594 PopulateSessionHeaderFromSpecifics(header, 618 PopulateSessionHeaderFromSpecifics(header,
595 modification_time, 619 modification_time,
596 foreign_session); 620 foreign_session);
597 621
598 // Reset the tab/window tracking for this session (must do this before 622 // Reset the tab/window tracking for this session (must do this before
599 // we start calling PutWindowInSession and PutTabInWindow so that all 623 // we start calling PutWindowInSession and PutTabInWindow so that all
600 // unused tabs/windows get cleared by the CleanupSession(...) call). 624 // unused tabs/windows get cleared by the CleanupSession(...) call).
601 session_tracker_.ResetSessionTracking(foreign_session_tag); 625 session_tracker_.ResetSessionTracking(foreign_session_tag);
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
1005 << " with age " << session_age_in_days << ", deleting."; 1029 << " with age " << session_age_in_days << ", deleting.";
1006 DeleteForeignSessionInternal(session_tag, &changes); 1030 DeleteForeignSessionInternal(session_tag, &changes);
1007 } 1031 }
1008 } 1032 }
1009 1033
1010 if (!changes.empty()) 1034 if (!changes.empty())
1011 sync_processor_->ProcessSyncChanges(FROM_HERE, changes); 1035 sync_processor_->ProcessSyncChanges(FROM_HERE, changes);
1012 } 1036 }
1013 1037
1014 }; // namespace browser_sync 1038 }; // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/sessions/sessions_sync_manager.h ('k') | chrome/browser/sync/sessions/sessions_sync_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698