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

Side by Side Diff: content/browser/indexed_db/indexed_db_callbacks.cc

Issue 774593004: IndexedDB: Fixed cursor/blob use-after-free bug (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed unused BlobStorageContext param from CreateBlobData() Created 6 years 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
« no previous file with comments | « no previous file | content/browser/indexed_db/indexed_db_dispatcher_host.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "content/browser/indexed_db/indexed_db_callbacks.h" 5 #include "content/browser/indexed_db/indexed_db_callbacks.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/guid.h"
10 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
11 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h" 11 #include "base/time/time.h"
13 #include "content/browser/child_process_security_policy_impl.h" 12 #include "content/browser/child_process_security_policy_impl.h"
14 #include "content/browser/fileapi/fileapi_message_filter.h" 13 #include "content/browser/fileapi/fileapi_message_filter.h"
15 #include "content/browser/indexed_db/indexed_db_blob_info.h" 14 #include "content/browser/indexed_db/indexed_db_blob_info.h"
16 #include "content/browser/indexed_db/indexed_db_connection.h" 15 #include "content/browser/indexed_db/indexed_db_connection.h"
17 #include "content/browser/indexed_db/indexed_db_context_impl.h" 16 #include "content/browser/indexed_db/indexed_db_context_impl.h"
18 #include "content/browser/indexed_db/indexed_db_cursor.h" 17 #include "content/browser/indexed_db/indexed_db_cursor.h"
19 #include "content/browser/indexed_db/indexed_db_database_callbacks.h" 18 #include "content/browser/indexed_db/indexed_db_database_callbacks.h"
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 UMA_HISTOGRAM_MEDIUM_TIMES( 215 UMA_HISTOGRAM_MEDIUM_TIMES(
217 "WebCore.IndexedDB.OpenTime.Success", 216 "WebCore.IndexedDB.OpenTime.Success",
218 base::TimeTicks::Now() - connection_open_start_time_); 217 base::TimeTicks::Now() - connection_open_start_time_);
219 connection_open_start_time_ = base::TimeTicks(); 218 connection_open_start_time_ = base::TimeTicks();
220 } 219 }
221 } 220 }
222 221
223 static std::string CreateBlobData( 222 static std::string CreateBlobData(
224 const IndexedDBBlobInfo& blob_info, 223 const IndexedDBBlobInfo& blob_info,
225 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, 224 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
226 storage::BlobStorageContext* blob_storage_context,
227 base::TaskRunner* task_runner) { 225 base::TaskRunner* task_runner) {
228 std::string uuid = blob_info.uuid(); 226 if (!blob_info.uuid().empty()) {
229 if (!uuid.empty()) {
230 // We're sending back a live blob, not a reference into our backing store. 227 // We're sending back a live blob, not a reference into our backing store.
231 scoped_ptr<storage::BlobDataHandle> blob_data_handle( 228 return dispatcher_host->HoldBlobData(blob_info);
232 blob_storage_context->GetBlobDataFromUUID(uuid));
233 dispatcher_host->HoldBlobDataHandle(uuid, blob_data_handle.Pass());
234 return uuid;
235 } 229 }
236 scoped_refptr<ShareableFileReference> shareable_file = 230 scoped_refptr<ShareableFileReference> shareable_file =
237 ShareableFileReference::Get(blob_info.file_path()); 231 ShareableFileReference::Get(blob_info.file_path());
238 if (!shareable_file.get()) { 232 if (!shareable_file.get()) {
239 shareable_file = ShareableFileReference::GetOrCreate( 233 shareable_file = ShareableFileReference::GetOrCreate(
240 blob_info.file_path(), 234 blob_info.file_path(),
241 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE, 235 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE,
242 task_runner); 236 task_runner);
243 if (!blob_info.release_callback().is_null()) 237 if (!blob_info.release_callback().is_null())
244 shareable_file->AddFinalReleaseCallback(blob_info.release_callback()); 238 shareable_file->AddFinalReleaseCallback(blob_info.release_callback());
245 } 239 }
246 240 return dispatcher_host->HoldBlobData(blob_info);
247 uuid = base::GenerateGUID();
248 scoped_refptr<storage::BlobData> blob_data = new storage::BlobData(uuid);
249 blob_data->set_content_type(base::UTF16ToUTF8(blob_info.type()));
250 blob_data->AppendFile(
251 blob_info.file_path(), 0, blob_info.size(), blob_info.last_modified());
252 scoped_ptr<storage::BlobDataHandle> blob_data_handle(
253 blob_storage_context->AddFinishedBlob(blob_data.get()));
254 dispatcher_host->HoldBlobDataHandle(uuid, blob_data_handle.Pass());
255
256 return uuid;
257 } 241 }
258 242
259 static bool CreateAllBlobs( 243 static bool CreateAllBlobs(
260 const std::vector<IndexedDBBlobInfo>& blob_info, 244 const std::vector<IndexedDBBlobInfo>& blob_info,
261 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info, 245 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info,
262 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) { 246 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) {
263 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); 247 DCHECK_EQ(blob_info.size(), blob_or_file_info->size());
264 size_t i; 248 size_t i;
265 if (!dispatcher_host->blob_storage_context()) 249 if (!dispatcher_host->blob_storage_context())
266 return false; 250 return false;
267 for (i = 0; i < blob_info.size(); ++i) { 251 for (i = 0; i < blob_info.size(); ++i) {
268 (*blob_or_file_info)[i].uuid = 252 (*blob_or_file_info)[i].uuid =
269 CreateBlobData(blob_info[i], 253 CreateBlobData(blob_info[i],
270 dispatcher_host, 254 dispatcher_host,
271 dispatcher_host->blob_storage_context(),
272 dispatcher_host->Context()->TaskRunner()); 255 dispatcher_host->Context()->TaskRunner());
273 } 256 }
274 return true; 257 return true;
275 } 258 }
276 259
277 template <class ParamType, class MsgType> 260 template <class ParamType, class MsgType>
278 static void CreateBlobsAndSend( 261 static void CreateBlobsAndSend(
279 ParamType* params, 262 ParamType* params,
280 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, 263 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
281 const std::vector<IndexedDBBlobInfo>& blob_info, 264 const std::vector<IndexedDBBlobInfo>& blob_info,
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 ipc_thread_id_, ipc_callbacks_id_)); 584 ipc_thread_id_, ipc_callbacks_id_));
602 dispatcher_host_ = NULL; 585 dispatcher_host_ = NULL;
603 } 586 }
604 587
605 void IndexedDBCallbacks::SetConnectionOpenStartTime( 588 void IndexedDBCallbacks::SetConnectionOpenStartTime(
606 const base::TimeTicks& start_time) { 589 const base::TimeTicks& start_time) {
607 connection_open_start_time_ = start_time; 590 connection_open_start_time_ = start_time;
608 } 591 }
609 592
610 } // namespace content 593 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/browser/indexed_db/indexed_db_dispatcher_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698