Index: content/browser/renderer_host/database_message_filter.cc |
diff --git a/content/browser/renderer_host/database_message_filter.cc b/content/browser/renderer_host/database_message_filter.cc |
index 98d930629a177c2e3af031b6daa5ea0db531228e..ab3eecc3001ef5753541feb9cb6987b8f4ab401c 100644 |
--- a/content/browser/renderer_host/database_message_filter.cc |
+++ b/content/browser/renderer_host/database_message_filter.cc |
@@ -25,6 +25,7 @@ |
#include "storage/browser/quota/quota_manager_proxy.h" |
#include "storage/common/database/database_identifier.h" |
#include "third_party/sqlite/sqlite3.h" |
+#include "url/origin.h" |
#if defined(OS_POSIX) |
#include "base/file_descriptor_posix.h" |
@@ -42,6 +43,10 @@ namespace { |
const int kNumDeleteRetries = 2; |
const int kDelayDeleteRetryMs = 100; |
+bool IsOriginValid(const url::Origin& origin) { |
+ return !origin.unique(); |
+} |
+ |
} // namespace |
DatabaseMessageFilter::DatabaseMessageFilter( |
@@ -250,10 +255,15 @@ void DatabaseMessageFilter::OnDatabaseGetFileSize( |
} |
void DatabaseMessageFilter::OnDatabaseGetSpaceAvailable( |
- const std::string& origin_identifier, IPC::Message* reply_msg) { |
+ const url::Origin& origin, IPC::Message* reply_msg) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK(db_tracker_->quota_manager_proxy()); |
+ if (!IsOriginValid(origin)) { |
+ bad_message::ReceivedBadMessage(this, bad_message::DBMF_INVALID_ORIGIN); |
+ return; |
+ } |
+ |
QuotaManager* quota_manager = |
db_tracker_->quota_manager_proxy()->quota_manager(); |
if (!quota_manager) { |
@@ -268,7 +278,7 @@ void DatabaseMessageFilter::OnDatabaseGetSpaceAvailable( |
TRACE_EVENT0("io", "DatabaseMessageFilter::OnDatabaseGetSpaceAvailable"); |
quota_manager->GetUsageAndQuota( |
- storage::GetOriginFromIdentifier(origin_identifier), |
+ GURL(origin.Serialize()), |
storage::kStorageTypeTemporary, |
base::Bind( |
&DatabaseMessageFilter::OnDatabaseGetUsageAndQuota, this, reply_msg)); |
@@ -299,36 +309,43 @@ void DatabaseMessageFilter::OnDatabaseSetFileSize( |
} |
void DatabaseMessageFilter::OnDatabaseOpened( |
- const std::string& origin_identifier, |
+ const url::Origin& origin, |
const base::string16& database_name, |
const base::string16& description, |
int64_t estimated_size) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- if (!storage::IsValidOriginIdentifier(origin_identifier)) { |
- bad_message::ReceivedBadMessage(this, |
- bad_message::DBMF_INVALID_ORIGIN_ON_OPEN); |
michaeln
2016/04/06 20:55:14
is there a way to mark DBMF_INVALID_ORIGIN_ON_OPEN
jsbell
2016/04/06 23:28:22
I went the other direction and reverted to emittin
Mark P
2016/04/07 21:40:41
Well, I think the benefit only comes when there ar
|
+ if (!IsOriginValid(origin)) { |
+ bad_message::ReceivedBadMessage(this, bad_message::DBMF_INVALID_ORIGIN); |
return; |
} |
- UMA_HISTOGRAM_BOOLEAN( |
- "websql.OpenDatabase", |
- IsOriginSecure(storage::GetOriginFromIdentifier(origin_identifier))); |
+ GURL origin_url(origin.Serialize()); |
+ UMA_HISTOGRAM_BOOLEAN("websql.OpenDatabase", IsOriginSecure(origin_url)); |
int64_t database_size = 0; |
+ std::string origin_identifier(storage::GetIdentifierFromOrigin(origin_url)); |
db_tracker_->DatabaseOpened(origin_identifier, database_name, description, |
estimated_size, &database_size); |
+ |
database_connections_.AddConnection(origin_identifier, database_name); |
- Send(new DatabaseMsg_UpdateSize(origin_identifier, database_name, |
- database_size)); |
+ Send(new DatabaseMsg_UpdateSize(origin, database_name, database_size)); |
} |
void DatabaseMessageFilter::OnDatabaseModified( |
- const std::string& origin_identifier, |
+ const url::Origin& origin, |
const base::string16& database_name) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- if (!database_connections_.IsDatabaseOpened( |
- origin_identifier, database_name)) { |
+ |
+ if (!IsOriginValid(origin)) { |
+ bad_message::ReceivedBadMessage(this, bad_message::DBMF_INVALID_ORIGIN); |
+ return; |
+ } |
+ |
+ std::string origin_identifier( |
+ storage::GetIdentifierFromOrigin(GURL(origin.Serialize()))); |
+ if (!database_connections_.IsDatabaseOpened(origin_identifier, |
+ database_name)) { |
bad_message::ReceivedBadMessage(this, |
bad_message::DBMF_DB_NOT_OPEN_ON_MODIFY); |
return; |
@@ -338,9 +355,17 @@ void DatabaseMessageFilter::OnDatabaseModified( |
} |
void DatabaseMessageFilter::OnDatabaseClosed( |
- const std::string& origin_identifier, |
+ const url::Origin& origin, |
const base::string16& database_name) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
+ |
+ if (!IsOriginValid(origin)) { |
+ bad_message::ReceivedBadMessage(this, bad_message::DBMF_INVALID_ORIGIN); |
+ return; |
+ } |
+ |
+ std::string origin_identifier( |
+ storage::GetIdentifierFromOrigin(GURL(origin.Serialize()))); |
if (!database_connections_.IsDatabaseOpened( |
origin_identifier, database_name)) { |
bad_message::ReceivedBadMessage(this, |
@@ -353,17 +378,17 @@ void DatabaseMessageFilter::OnDatabaseClosed( |
} |
void DatabaseMessageFilter::OnHandleSqliteError( |
- const std::string& origin_identifier, |
+ const url::Origin& origin, |
const base::string16& database_name, |
int error) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- if (!storage::IsValidOriginIdentifier(origin_identifier)) { |
- bad_message::ReceivedBadMessage( |
- this, bad_message::DBMF_INVALID_ORIGIN_ON_SQLITE_ERROR); |
+ if (!IsOriginValid(origin)) { |
+ bad_message::ReceivedBadMessage(this, bad_message::DBMF_INVALID_ORIGIN); |
return; |
} |
- |
- db_tracker_->HandleSqliteError(origin_identifier, database_name, error); |
+ db_tracker_->HandleSqliteError( |
+ storage::GetIdentifierFromOrigin(GURL(origin.Serialize())), database_name, |
+ error); |
} |
void DatabaseMessageFilter::OnDatabaseSizeChanged( |
@@ -372,8 +397,9 @@ void DatabaseMessageFilter::OnDatabaseSizeChanged( |
int64_t database_size) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
if (database_connections_.IsOriginUsed(origin_identifier)) { |
- Send(new DatabaseMsg_UpdateSize(origin_identifier, database_name, |
- database_size)); |
+ Send(new DatabaseMsg_UpdateSize( |
+ url::Origin(storage::GetOriginFromIdentifier(origin_identifier)), |
+ database_name, database_size)); |
} |
} |
@@ -381,7 +407,9 @@ void DatabaseMessageFilter::OnDatabaseScheduledForDeletion( |
const std::string& origin_identifier, |
const base::string16& database_name) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- Send(new DatabaseMsg_CloseImmediately(origin_identifier, database_name)); |
+ Send(new DatabaseMsg_CloseImmediately( |
+ url::Origin(storage::GetOriginFromIdentifier(origin_identifier)), |
+ database_name)); |
} |
} // namespace content |