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

Side by Side Diff: net/spdy/spdy_framer.cc

Issue 246933003: SPDY: Fix flaky padding edge case. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase only. Created 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_framer.h ('k') | net/spdy/spdy_framer_test.cc » ('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 // TODO(rtenhove) clean up frame buffer size calculations so that we aren't 5 // TODO(rtenhove) clean up frame buffer size calculations so that we aren't
6 // constantly adding and subtracting header sizes; this is ugly and error- 6 // constantly adding and subtracting header sizes; this is ugly and error-
7 // prone. 7 // prone.
8 8
9 #include "net/spdy/spdy_framer.h" 9 #include "net/spdy/spdy_framer.h"
10 10
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 break; 557 break;
558 } 558 }
559 559
560 case SPDY_CONSUME_PADDING: { 560 case SPDY_CONSUME_PADDING: {
561 size_t bytes_read = ProcessFramePadding(data, len); 561 size_t bytes_read = ProcessFramePadding(data, len);
562 len -= bytes_read; 562 len -= bytes_read;
563 data += bytes_read; 563 data += bytes_read;
564 break; 564 break;
565 } 565 }
566 566
567 case SPDY_IGNORE_REMAINING_PAYLOAD: 567 case SPDY_IGNORE_REMAINING_PAYLOAD: {
568 // control frame has too-large payload 568 size_t bytes_read = ProcessIgnoredControlFramePayload(/*data,*/ len);
569 // intentional fallthrough 569 len -= bytes_read;
570 data += bytes_read;
571 break;
572 }
573
570 case SPDY_FORWARD_STREAM_FRAME: { 574 case SPDY_FORWARD_STREAM_FRAME: {
571 size_t bytes_read = ProcessDataFramePayload(data, len); 575 size_t bytes_read = ProcessDataFramePayload(data, len);
572 len -= bytes_read; 576 len -= bytes_read;
573 data += bytes_read; 577 data += bytes_read;
574 break; 578 break;
575 } 579 }
580
576 default: 581 default:
577 LOG(DFATAL) << "Invalid value for " << display_protocol_ 582 LOG(DFATAL) << "Invalid value for " << display_protocol_
578 << " framer state: " << state_; 583 << " framer state: " << state_;
579 // This ensures that we don't infinite-loop if state_ gets an 584 // This ensures that we don't infinite-loop if state_ gets an
580 // invalid value somehow, such as due to a SpdyFramer getting deleted 585 // invalid value somehow, such as due to a SpdyFramer getting deleted
581 // from a callback it calls. 586 // from a callback it calls.
582 goto bottom; 587 goto bottom;
583 } 588 }
584 } while (state_ != previous_state_); 589 } while (state_ != previous_state_);
585 bottom: 590 bottom:
(...skipping 1315 matching lines...) Expand 10 before | Expand all | Expand 10 after
1901 // Communicate the padding to the visitor through a NULL data pointer, with 1906 // Communicate the padding to the visitor through a NULL data pointer, with
1902 // a nonzero size. 1907 // a nonzero size.
1903 if (amount_to_discard) { 1908 if (amount_to_discard) {
1904 visitor_->OnStreamFrameData( 1909 visitor_->OnStreamFrameData(
1905 current_frame_stream_id_, NULL, amount_to_discard, false); 1910 current_frame_stream_id_, NULL, amount_to_discard, false);
1906 } 1911 }
1907 data += amount_to_discard; 1912 data += amount_to_discard;
1908 len -= amount_to_discard; 1913 len -= amount_to_discard;
1909 remaining_padding_payload_length_ -= amount_to_discard; 1914 remaining_padding_payload_length_ -= amount_to_discard;
1910 remaining_data_length_ -= amount_to_discard; 1915 remaining_data_length_ -= amount_to_discard;
1911
1912 // If the FIN flag is set, and there is no more data in this data
1913 // frame, inform the visitor of EOF via a 0-length data frame.
1914 if (!remaining_data_length_ && current_frame_flags_ & DATA_FLAG_FIN) {
1915 visitor_->OnStreamFrameData(current_frame_stream_id_, NULL, 0, true);
1916 }
1917 } 1916 }
1918 1917
1919 if (remaining_data_length_ == 0) { 1918 if (remaining_data_length_ == 0) {
1919 // If the FIN flag is set, and there is no more data in this data frame,
1920 // inform the visitor of EOF via a 0-length data frame.
1921 if (current_frame_flags_ & DATA_FLAG_FIN) {
1922 visitor_->OnStreamFrameData(current_frame_stream_id_, NULL, 0, true);
1923 }
1924
1920 CHANGE_STATE(SPDY_AUTO_RESET); 1925 CHANGE_STATE(SPDY_AUTO_RESET);
1921 } 1926 }
1922 return original_len - len; 1927 return original_len - len;
1923 } 1928 }
1924 1929
1925 size_t SpdyFramer::ProcessDataFramePayload(const char* data, size_t len) { 1930 size_t SpdyFramer::ProcessDataFramePayload(const char* data, size_t len) {
1926 size_t original_len = len; 1931 size_t original_len = len;
1927 if (remaining_data_length_ - remaining_padding_payload_length_ > 0) { 1932 if (remaining_data_length_ - remaining_padding_payload_length_ > 0) {
1928 size_t amount_to_forward = std::min( 1933 size_t amount_to_forward = std::min(
1929 remaining_data_length_ - remaining_padding_payload_length_, len); 1934 remaining_data_length_ - remaining_padding_payload_length_, len);
1930 if (amount_to_forward && state_ != SPDY_IGNORE_REMAINING_PAYLOAD) { 1935 if (amount_to_forward && state_ != SPDY_IGNORE_REMAINING_PAYLOAD) {
1931 // Only inform the visitor if there is data. 1936 // Only inform the visitor if there is data.
1932 if (amount_to_forward) { 1937 if (amount_to_forward) {
1933 visitor_->OnStreamFrameData( 1938 visitor_->OnStreamFrameData(
1934 current_frame_stream_id_, data, amount_to_forward, false); 1939 current_frame_stream_id_, data, amount_to_forward, false);
1935 } 1940 }
1936 } 1941 }
1937 data += amount_to_forward; 1942 data += amount_to_forward;
1938 len -= amount_to_forward; 1943 len -= amount_to_forward;
1939 remaining_data_length_ -= amount_to_forward; 1944 remaining_data_length_ -= amount_to_forward;
1940
1941 // If the FIN flag is set, and there is no more data in this data
1942 // frame, inform the visitor of EOF via a 0-length data frame.
1943 if (!remaining_data_length_ && current_frame_flags_ & DATA_FLAG_FIN) {
1944 visitor_->OnStreamFrameData(current_frame_stream_id_, NULL, 0, true);
1945 }
1946 } 1945 }
1947 1946
1948 if (remaining_data_length_ == remaining_padding_payload_length_) { 1947 if (remaining_data_length_ == remaining_padding_payload_length_) {
1949 CHANGE_STATE(SPDY_CONSUME_PADDING); 1948 CHANGE_STATE(SPDY_CONSUME_PADDING);
1950 } 1949 }
1951 return original_len - len; 1950 return original_len - len;
1952 } 1951 }
1953 1952
1953 size_t SpdyFramer::ProcessIgnoredControlFramePayload(/*const char* data,*/
1954 size_t len) {
1955 size_t original_len = len;
1956 if (remaining_data_length_ > 0) {
1957 size_t amount_to_ignore = std::min(remaining_data_length_, len);
1958 len -= amount_to_ignore;
1959 remaining_data_length_ -= amount_to_ignore;
1960 }
1961
1962 if (remaining_data_length_ == 0) {
1963 CHANGE_STATE(SPDY_AUTO_RESET);
1964 }
1965 return original_len - len;
1966 }
1967
1954 size_t SpdyFramer::ParseHeaderBlockInBuffer(const char* header_data, 1968 size_t SpdyFramer::ParseHeaderBlockInBuffer(const char* header_data,
1955 size_t header_length, 1969 size_t header_length,
1956 SpdyHeaderBlock* block) const { 1970 SpdyHeaderBlock* block) const {
1957 SpdyFrameReader reader(header_data, header_length); 1971 SpdyFrameReader reader(header_data, header_length);
1958 1972
1959 // Read number of headers. 1973 // Read number of headers.
1960 uint32 num_headers; 1974 uint32 num_headers;
1961 if (protocol_version() <= SPDY2) { 1975 if (protocol_version() <= SPDY2) {
1962 uint16 temp; 1976 uint16 temp;
1963 if (!reader.ReadUInt16(&temp)) { 1977 if (!reader.ReadUInt16(&temp)) {
(...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after
2943 builder->Seek(compressed_size); 2957 builder->Seek(compressed_size);
2944 builder->RewriteLength(*this); 2958 builder->RewriteLength(*this);
2945 2959
2946 pre_compress_bytes.Add(uncompressed_len); 2960 pre_compress_bytes.Add(uncompressed_len);
2947 post_compress_bytes.Add(compressed_size); 2961 post_compress_bytes.Add(compressed_size);
2948 2962
2949 compressed_frames.Increment(); 2963 compressed_frames.Increment();
2950 } 2964 }
2951 2965
2952 } // namespace net 2966 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.h ('k') | net/spdy/spdy_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698