Changeset 252817 in webkit
- Timestamp:
- Nov 22, 2019 4:42:28 PM (4 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r252812 r252817 1 2019-11-22 Kate Cheney <katherine_cheney@apple.com> 2 3 ITP Database crashes if table schema is not correct 4 https://bugs.webkit.org/show_bug.cgi?id=204458 5 <rdar://problem/57399084> 6 7 Reviewed by Brent Fulgham. 8 9 ITP database was crashing if the table schema wasn't correct. This 10 should instead be handled by re-opening a new database with a correct 11 schema to allow for future schema updates. 12 13 * NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.cpp: 14 (WebKit::ResourceLoadStatisticsDatabaseStore::isCorrectTableSchema): 15 (WebKit::ResourceLoadStatisticsDatabaseStore::openAndDropOldDatabaseIfNecessary): 16 * NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.h: 17 1 18 2019-11-22 Chris Dumez <cdumez@apple.com> 2 19 -
trunk/Source/WebKit/NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.cpp
r252641 r252817 122 122 constexpr auto getResourceDataByDomainNameQuery = "SELECT * FROM ObservedDomains WHERE registrableDomain = ?"; 123 123 constexpr auto getAllDomainsQuery = "SELECT registrableDomain FROM ObservedDomains"_s; 124 125 const char* tables[] = { 126 "ObservedDomains", 127 "TopLevelDomains", 128 "StorageAccessUnderTopFrameDomains", 129 "TopFrameUniqueRedirectsTo", 130 "TopFrameUniqueRedirectsFrom", 131 "TopFrameLinkDecorationsFrom", 132 "TopFrameLoadedThirdPartyScripts", 133 "SubframeUnderTopFrameDomains", 134 "SubresourceUnderTopFrameDomains", 135 "SubresourceUniqueRedirectsTo", 136 "SubresourceUniqueRedirectsFrom" 137 }; 124 138 125 139 // CREATE TABLE Queries … … 289 303 } 290 304 305 static void resetStatement(SQLiteStatement& statement) 306 { 307 int resetResult = statement.reset(); 308 ASSERT_UNUSED(resetResult, resetResult == SQLITE_OK); 309 } 310 311 bool ResourceLoadStatisticsDatabaseStore::isCorrectTableSchema() 312 { 313 SQLiteStatement statement(m_database, "SELECT 1 from sqlite_master WHERE type='table' and tbl_name=?"); 314 if (statement.prepare() != SQLITE_OK) { 315 RELEASE_LOG_ERROR(Network, "%p - ResourceLoadStatisticsDatabaseStore::isCorrectTableSchema failed to prepare, error message: %{public}s", this, m_database.lastErrorMsg()); 316 return false; 317 } 318 319 bool hasAllTables = true; 320 for (auto table : tables) { 321 if (statement.bindText(1, table) != SQLITE_OK) { 322 RELEASE_LOG_ERROR(Network, "%p - ResourceLoadStatisticsDatabaseStore::isCorrectTableSchema failed to bind, error message: %{public}s", this, m_database.lastErrorMsg()); 323 return false; 324 } 325 if (statement.step() != SQLITE_ROW) { 326 RELEASE_LOG_ERROR(Network, "%p - ResourceLoadStatisticsDatabaseStore::isCorrectTableSchema schema is missing table: %s", this, table); 327 hasAllTables = false; 328 } 329 resetStatement(statement); 330 } 331 return hasAllTables; 332 } 333 291 334 void ResourceLoadStatisticsDatabaseStore::openAndDropOldDatabaseIfNecessary() 292 335 { 293 336 openITPDatabase(); 337 338 if (!isCorrectTableSchema()) { 339 m_database.close(); 340 // FIXME: Migrate existing data to new database file instead of deleting it (204482). 341 FileSystem::deleteFile(m_storageDirectoryPath); 342 openITPDatabase(); 343 return; 344 } 294 345 295 346 String currentSchema; … … 323 374 openITPDatabase(); 324 375 } 325 }326 327 static void resetStatement(SQLiteStatement& statement)328 {329 int resetResult = statement.reset();330 ASSERT_UNUSED(resetResult, resetResult == SQLITE_OK);331 376 } 332 377 -
trunk/Source/WebKit/NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.h
r252641 r252817 137 137 private: 138 138 void openITPDatabase(); 139 bool isCorrectTableSchema(); 139 140 void openAndDropOldDatabaseIfNecessary(); 140 141 String getDomainStringFromDomainID(unsigned) const;
Note: See TracChangeset
for help on using the changeset viewer.