diff options
Diffstat (limited to 'net/url_request/url_request_job.cc')
-rw-r--r-- | net/url_request/url_request_job.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc index 4518d8a..b84fdd5 100644 --- a/net/url_request/url_request_job.cc +++ b/net/url_request/url_request_job.cc @@ -122,13 +122,21 @@ void URLRequestJob::ContinueDespiteLastError() { void URLRequestJob::FollowDeferredRedirect() { DCHECK(deferred_redirect_status_code_ != -1); + // NOTE: deferred_redirect_url_ may be invalid, and attempting to redirect to // such an URL will fail inside FollowRedirect. The DCHECK above asserts // that we called OnReceivedRedirect. - FollowRedirect(deferred_redirect_url_, deferred_redirect_status_code_); + // It is also possible that FollowRedirect will drop the last reference to + // this job, so we need to reset our members before calling it. + + GURL redirect_url = deferred_redirect_url_; + int redirect_status_code = deferred_redirect_status_code_; + deferred_redirect_url_ = GURL(); deferred_redirect_status_code_ = -1; + + FollowRedirect(redirect_url, redirect_status_code); } int64 URLRequestJob::GetByteReadCount() const { |