Mercurial > hg > nginx
changeset 8250:8f9cb6d66662 quic
Fixed parsing of CONNECTION CLOSE2 frames.
The "frame_type" field is not passed in case of 0x1d frame.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Fri, 20 Mar 2020 15:14:00 +0300 |
parents | 3f4b407fa0b8 |
children | c217a907ce42 |
files | src/event/ngx_event_quic_transport.c |
diffstat | 1 files changed, 19 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/event/ngx_event_quic_transport.c +++ b/src/event/ngx_event_quic_transport.c @@ -624,12 +624,24 @@ ngx_quic_parse_frame(ngx_quic_header_t * case NGX_QUIC_FT_CONNECTION_CLOSE: case NGX_QUIC_FT_CONNECTION_CLOSE2: - p = ngx_quic_parse_int_multi(p, end, &f->u.close.error_code, - &f->u.close.frame_type, - &f->u.close.reason.len, NULL); + p = ngx_quic_parse_int(p, end, &f->u.close.error_code); if (p == NULL) { ngx_log_error(NGX_LOG_ERR, pkt->log, 0, - "failed to parse close connection frame"); + "failed to parse close connection frame error code"); + return NGX_ERROR; + } + + if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) { + p = ngx_quic_parse_int(p, end, &f->u.close.frame_type); + ngx_log_error(NGX_LOG_ERR, pkt->log, 0, + "failed to parse close connection frame type"); + return NGX_ERROR; + } + + p = ngx_quic_parse_int(p, end, &f->u.close.reason.len); + if (p == NULL) { + ngx_log_error(NGX_LOG_ERR, pkt->log, 0, + "failed to parse close reason length"); return NGX_ERROR; } @@ -657,10 +669,9 @@ ngx_quic_parse_frame(ngx_quic_header_t * &f->u.close.reason); } else { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "CONN.CLOSE2: { (0x%xi) type=0x%xi reason '%V'}", - f->u.close.error_code, f->u.close.frame_type, - &f->u.close.reason); + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0, + "CONN.CLOSE2: { (0x%xi) reason '%V'}", + f->u.close.error_code, &f->u.close.reason); } break;