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

Unified Diff: components/cronet/android/cronet_bidirectional_stream_adapter.cc

Issue 1924623002: [Cronet] Do not call into BidirectionalStream::SendData if stream failed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2704
Patch Set: Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: components/cronet/android/cronet_bidirectional_stream_adapter.cc
diff --git a/components/cronet/android/cronet_bidirectional_stream_adapter.cc b/components/cronet/android/cronet_bidirectional_stream_adapter.cc
index f259f3bf8f5a97ded278a2ec6ba452a87eb6ebc2..abdac4593e1dbc0acdbbc426c38ea15f6fd63fbe 100644
--- a/components/cronet/android/cronet_bidirectional_stream_adapter.cc
+++ b/components/cronet/android/cronet_bidirectional_stream_adapter.cc
@@ -58,7 +58,7 @@ CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter(
CronetURLRequestContextAdapter* context,
JNIEnv* env,
const JavaParamRef<jobject>& jbidi_stream)
- : context_(context), owner_(env, jbidi_stream) {}
+ : context_(context), owner_(env, jbidi_stream), stream_failed_(false) {}
CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() {
DCHECK(context_->IsOnNetworkThread());
@@ -236,6 +236,7 @@ void CronetBidirectionalStreamAdapter::OnTrailersReceived(
void CronetBidirectionalStreamAdapter::OnFailed(int error) {
DCHECK(context_->IsOnNetworkThread());
+ stream_failed_ = true;
JNIEnv* env = base::android::AttachCurrentThread();
cronet::Java_CronetBidirectionalStream_onError(
env, owner_.obj(), NetErrorToUrlRequestError(error), error,
@@ -287,6 +288,14 @@ void CronetBidirectionalStreamAdapter::WriteDataOnNetworkThread(
DCHECK(write_buffer);
DCHECK(!write_buffer_);
+ if (stream_failed_) {
+ // If stream failed between the time when WriteData is invoked and
+ // WriteDataOnNetworkThread is executed, do not call into |bidi_stream_|
+ // since the underlying stream might have been destroyed. Do not invoke
+ // Java callback either, since onError is posted when |stream_failed_| is
+ // set to true.
+ return;
+ }
write_buffer_ = write_buffer;
bidi_stream_->SendData(write_buffer_.get(), buffer_size, end_of_stream);
}

Powered by Google App Engine
This is Rietveld 408576698