]> git.kaiwu.me - nginx.git/commitdiff
QUIC: prevented posted push event while in the draining state.
authorVladimir Homutov <vl@nginx.com>
Mon, 21 Sep 2020 10:58:17 +0000 (13:58 +0300)
committerVladimir Homutov <vl@nginx.com>
Mon, 21 Sep 2020 10:58:17 +0000 (13:58 +0300)
If the push event was posted before ngx_quic_close_connection(), it could send
data in the draining state.

src/event/ngx_event_quic.c

index 9301aa9a6b2cac7b4e1d14ca0d8201ef70d0493c..a5f85ee08a9eb7321b50b3af9663302d7eb4a584 100644 (file)
@@ -1492,8 +1492,16 @@ ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc)
         return NGX_AGAIN;
     }
 
-    if (qc->close.timer_set) {
-        return NGX_AGAIN;
+    if (qc->push.timer_set) {
+        ngx_del_timer(&qc->push);
+    }
+
+    if (qc->pto.timer_set) {
+        ngx_del_timer(&qc->pto);
+    }
+
+    if (qc->push.posted) {
+        ngx_delete_posted_event(&qc->push);
     }
 
     for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
@@ -1505,16 +1513,8 @@ ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc)
         ngx_quic_free_frames(c, &qc->send_ctx[i].sent);
     }
 
-    if (qc->push.timer_set) {
-        ngx_del_timer(&qc->push);
-    }
-
-    if (qc->pto.timer_set) {
-        ngx_del_timer(&qc->pto);
-    }
-
-    if (qc->push.posted) {
-        ngx_delete_posted_event(&qc->push);
+    if (qc->close.timer_set) {
+        return NGX_AGAIN;
     }
 
     ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,