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;