Bug 1381016 - Ensure we process FIN flags on all-padding final frames. r?swu draft
authorNicholas Hurley <hurley@mozilla.com>
Tue, 01 Aug 2017 15:24:44 -0700
changeset 619372 8f2fe81a82a305665da01997fd00bc6ab9cffed1
parent 614544 462d7561089c98e33382384896434861ad7bc491
child 640370 f3a0dd044beca6430e0942e952f495467bad9a6a
push id71651
push userbmo:hurley@mozilla.com
push dateTue, 01 Aug 2017 22:28:15 +0000
reviewersswu
bugs1381016
milestone56.0a1
Bug 1381016 - Ensure we process FIN flags on all-padding final frames. r?swu MozReview-Commit-ID: JuSGsYsmv4n
netwerk/protocol/http/Http2Session.cpp
--- a/netwerk/protocol/http/Http2Session.cpp
+++ b/netwerk/protocol/http/Http2Session.cpp
@@ -3026,17 +3026,20 @@ Http2Session::WriteSegmentsAgain(nsAHttp
   if (mDownstreamState == DISCARDING_DATA_FRAME ||
       mDownstreamState == DISCARDING_DATA_FRAME_PADDING) {
     char trash[4096];
     uint32_t discardCount = std::min(mInputFrameDataSize - mInputFrameDataRead,
                                      4096U);
     LOG3(("Http2Session::WriteSegments %p trying to discard %d bytes of data",
           this, discardCount));
 
-    if (!discardCount) {
+    if (!discardCount && mDownstreamState == DISCARDING_DATA_FRAME) {
+      // Only do this short-cirtuit if we're not discarding a pure padding
+      // frame, as we need to potentially handle the stream FIN in those cases.
+      // See bug 1381016 comment 36 for more details.
       ResetDownstreamState();
       Unused << ResumeRecv();
       return NS_BASE_STREAM_WOULD_BLOCK;
     }
 
     rv = NetworkRead(writer, trash, discardCount, countWritten);
 
     if (NS_FAILED(rv)) {