changeset 9069:03897c45798e quic

QUIC: defer setting the active flag for client stream events. Specifically, now it is kept unset until streams are initialized. Notably, this unbreaks OCSP with client certificates after 35e27117b593. Previously, the read event could be posted prematurely via ngx_quic_set_event() e.g., as part of handling a STREAM frame.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 18 Jan 2023 19:20:18 +0400
parents bf2267887014
children a954b551dc3f
files src/event/quic/ngx_event_quic_streams.c
diffstat 1 files changed, 21 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/quic/ngx_event_quic_streams.c
+++ b/src/event/quic/ngx_event_quic_streams.c
@@ -46,8 +46,8 @@ ngx_connection_t *
 ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi)
 {
     uint64_t                id;
-    ngx_connection_t       *pc;
-    ngx_quic_stream_t      *nqs;
+    ngx_connection_t       *pc, *sc;
+    ngx_quic_stream_t      *qs;
     ngx_quic_connection_t  *qc;
 
     pc = c->quic ? c->quic->parent : c;
@@ -101,12 +101,21 @@ ngx_quic_open_stream(ngx_connection_t *c
         qc->streams.server_streams_uni++;
     }
 
-    nqs = ngx_quic_create_stream(pc, id);
-    if (nqs == NULL) {
+    qs = ngx_quic_create_stream(pc, id);
+    if (qs == NULL) {
         return NULL;
     }
 
-    return nqs->connection;
+    sc = qs->connection;
+
+    sc->write->active = 1;
+    sc->write->ready = 1;
+
+    if (bidi) {
+        sc->read->active = 1;
+    }
+
+    return sc;
 }
 
 
@@ -534,6 +543,13 @@ ngx_quic_init_stream_handler(ngx_event_t
 
     ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic init stream");
 
+    if ((qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0) {
+        c->write->active = 1;
+        c->write->ready = 1;
+    }
+
+    c->read->active = 1;
+
     ngx_queue_remove(&qs->queue);
 
     c->listening->handler(c);
@@ -704,19 +720,6 @@ ngx_quic_create_stream(ngx_connection_t 
 
     log->connection = sc->number;
 
-    if ((id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0
-        || (id & NGX_QUIC_STREAM_SERVER_INITIATED))
-    {
-        sc->write->active = 1;
-        sc->write->ready = 1;
-    }
-
-    if ((id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0
-        || (id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0)
-    {
-        sc->read->active = 1;
-    }
-
     if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
         if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
             qs->send_max_data = qc->ctp.initial_max_stream_data_uni;