Mercurial > hg > nginx
comparison src/event/quic/ngx_event_quic_streams.c @ 8783:60c6e8d8d3ae quic
QUIC: make sure stream data size is lower than final size.
As per quic-transport 34, FINAL_SIZE_ERROR is generated if an endpoint received
a STREAM frame or a RESET_STREAM frame containing a final size that was lower
than the size of stream data that was already received.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Tue, 25 May 2021 16:41:59 +0300 |
parents | b3f6ad181df4 |
children | 7d32c3c93678 |
comparison
equal
deleted
inserted
replaced
8782:b3f6ad181df4 | 8783:60c6e8d8d3ae |
---|---|
855 if (f->fin) { | 855 if (f->fin) { |
856 sc->read->pending_eof = 1; | 856 sc->read->pending_eof = 1; |
857 qs->final_size = last; | 857 qs->final_size = last; |
858 } | 858 } |
859 | 859 |
860 qs->recv_last = last; | |
861 | |
860 if (f->offset == 0) { | 862 if (f->offset == 0) { |
861 sc->read->ready = 1; | 863 sc->read->ready = 1; |
862 } | 864 } |
863 | 865 |
864 if (ngx_quic_order_bufs(c, &qs->in, frame->data, f->offset) != NGX_OK) { | 866 if (ngx_quic_order_bufs(c, &qs->in, frame->data, f->offset) != NGX_OK) { |
882 | 884 |
883 if (last <= qs->recv_offset) { | 885 if (last <= qs->recv_offset) { |
884 return NGX_OK; | 886 return NGX_OK; |
885 } | 887 } |
886 | 888 |
889 if (qs->recv_last < last) { | |
890 qs->recv_last = last; | |
891 } | |
892 | |
887 if (f->offset < qs->recv_offset) { | 893 if (f->offset < qs->recv_offset) { |
888 ngx_quic_trim_bufs(frame->data, qs->recv_offset - f->offset); | 894 ngx_quic_trim_bufs(frame->data, qs->recv_offset - f->offset); |
889 f->offset = qs->recv_offset; | 895 f->offset = qs->recv_offset; |
890 } | 896 } |
891 | 897 |
893 qs->connection->read->ready = 1; | 899 qs->connection->read->ready = 1; |
894 } | 900 } |
895 | 901 |
896 if (f->fin) { | 902 if (f->fin) { |
897 if (qs->final_size != (uint64_t) -1 && qs->final_size != last) { | 903 if (qs->final_size != (uint64_t) -1 && qs->final_size != last) { |
904 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; | |
905 return NGX_ERROR; | |
906 } | |
907 | |
908 if (qs->recv_last > last) { | |
898 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; | 909 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; |
899 return NGX_ERROR; | 910 return NGX_ERROR; |
900 } | 911 } |
901 | 912 |
902 qs->connection->read->pending_eof = 1; | 913 qs->connection->read->pending_eof = 1; |
1127 if (qs->final_size != (uint64_t) -1 && qs->final_size != f->final_size) { | 1138 if (qs->final_size != (uint64_t) -1 && qs->final_size != f->final_size) { |
1128 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; | 1139 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; |
1129 return NGX_ERROR; | 1140 return NGX_ERROR; |
1130 } | 1141 } |
1131 | 1142 |
1143 if (qs->recv_last > f->final_size) { | |
1144 qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; | |
1145 return NGX_ERROR; | |
1146 } | |
1147 | |
1132 qs->final_size = f->final_size; | 1148 qs->final_size = f->final_size; |
1133 | 1149 |
1134 rev = qs->connection->read; | 1150 rev = qs->connection->read; |
1135 rev->error = 1; | 1151 rev->error = 1; |
1136 rev->ready = 1; | 1152 rev->ready = 1; |