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

Side by Side Diff: google_apis/drive/base_requests.cc

Issue 127463002: google_apis: Fix use-after-free of URLFetcher* in ResponseWriter (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 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
« no previous file with comments | « google_apis/drive/base_requests.h ('k') | no next file » | 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 "google_apis/drive/base_requests.h" 5 #include "google_apis/drive/base_requests.h"
6 6
7 #include "base/json/json_reader.h" 7 #include "base/json/json_reader.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/sequenced_task_runner.h" 9 #include "base/sequenced_task_runner.h"
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 get_content_callback_(get_content_callback) { 115 get_content_callback_(get_content_callback) {
116 if (!file_path.empty()) { 116 if (!file_path.empty()) {
117 file_writer_.reset( 117 file_writer_.reset(
118 new net::URLFetcherFileWriter(file_task_runner, file_path)); 118 new net::URLFetcherFileWriter(file_task_runner, file_path));
119 } 119 }
120 } 120 }
121 121
122 ResponseWriter::~ResponseWriter() { 122 ResponseWriter::~ResponseWriter() {
123 } 123 }
124 124
125 void ResponseWriter::Detach() {
126 url_fetcher_ = NULL;
127 }
128
125 void ResponseWriter::DisownFile() { 129 void ResponseWriter::DisownFile() {
126 DCHECK(file_writer_); 130 DCHECK(file_writer_);
127 file_writer_->DisownFile(); 131 file_writer_->DisownFile();
128 } 132 }
129 133
130 int ResponseWriter::Initialize(const net::CompletionCallback& callback) { 134 int ResponseWriter::Initialize(const net::CompletionCallback& callback) {
131 if (file_writer_) 135 if (file_writer_)
132 return file_writer_->Initialize(callback); 136 return file_writer_->Initialize(callback);
133 137
134 data_.clear(); 138 data_.clear();
135 return net::OK; 139 return net::OK;
136 } 140 }
137 141
138 int ResponseWriter::Write(net::IOBuffer* buffer, 142 int ResponseWriter::Write(net::IOBuffer* buffer,
139 int num_bytes, 143 int num_bytes,
140 const net::CompletionCallback& callback) { 144 const net::CompletionCallback& callback) {
141 // |get_content_callback_| and |file_writer_| are used only when the response 145 // |get_content_callback_| and |file_writer_| are used only when the response
142 // code is successful one. 146 // code is successful one.
143 if (IsSuccessfulResponseCode(url_fetcher_->GetResponseCode())) { 147 if (url_fetcher_ &&
148 IsSuccessfulResponseCode(url_fetcher_->GetResponseCode())) {
144 if (!get_content_callback_.is_null()) { 149 if (!get_content_callback_.is_null()) {
145 get_content_callback_.Run( 150 get_content_callback_.Run(
146 HTTP_SUCCESS, 151 HTTP_SUCCESS,
147 make_scoped_ptr(new std::string(buffer->data(), num_bytes))); 152 make_scoped_ptr(new std::string(buffer->data(), num_bytes)));
148 } 153 }
149 154
150 if (file_writer_) 155 if (file_writer_)
151 return file_writer_->Write(buffer, num_bytes, callback); 156 return file_writer_->Write(buffer, num_bytes, callback);
152 } 157 }
153 158
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 std::string* upload_content_type) { 288 std::string* upload_content_type) {
284 return false; 289 return false;
285 } 290 }
286 291
287 void UrlFetchRequestBase::GetOutputFilePath( 292 void UrlFetchRequestBase::GetOutputFilePath(
288 base::FilePath* local_file_path, 293 base::FilePath* local_file_path,
289 GetContentCallback* get_content_callback) { 294 GetContentCallback* get_content_callback) {
290 } 295 }
291 296
292 void UrlFetchRequestBase::Cancel() { 297 void UrlFetchRequestBase::Cancel() {
298 response_writer_->Detach();
293 response_writer_ = NULL; 299 response_writer_ = NULL;
294 url_fetcher_.reset(NULL); 300 url_fetcher_.reset(NULL);
295 RunCallbackOnPrematureFailure(GDATA_CANCELLED); 301 RunCallbackOnPrematureFailure(GDATA_CANCELLED);
296 sender_->RequestFinished(this); 302 sender_->RequestFinished(this);
297 } 303 }
298 304
299 GDataErrorCode UrlFetchRequestBase::GetErrorCode() { 305 GDataErrorCode UrlFetchRequestBase::GetErrorCode() {
300 return error_code_; 306 return error_code_;
301 } 307 }
302 308
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 download_action_callback_.Run(code, temp_file); 776 download_action_callback_.Run(code, temp_file);
771 OnProcessURLFetchResultsComplete(); 777 OnProcessURLFetchResultsComplete();
772 } 778 }
773 779
774 void DownloadFileRequestBase::RunCallbackOnPrematureFailure( 780 void DownloadFileRequestBase::RunCallbackOnPrematureFailure(
775 GDataErrorCode code) { 781 GDataErrorCode code) {
776 download_action_callback_.Run(code, base::FilePath()); 782 download_action_callback_.Run(code, base::FilePath());
777 } 783 }
778 784
779 } // namespace google_apis 785 } // namespace google_apis
OLDNEW
« no previous file with comments | « google_apis/drive/base_requests.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698