aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Kandaurov <pluknet@nginx.com>2023-01-18 19:20:18 +0400
committerSergey Kandaurov <pluknet@nginx.com>2023-01-18 19:20:18 +0400
commitb196429fbe5f2b60f464f94e93facb0889741dc6 (patch)
treeccab287f52a1596503aa216ae47ac06c3e1467bb /src
parentd76600874c495728b801fd6ec33978194928a6e4 (diff)
downloadnginx-b196429fbe5f2b60f464f94e93facb0889741dc6.tar.gz
nginx-b196429fbe5f2b60f464f94e93facb0889741dc6.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/event/quic/ngx_event_quic_streams.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/event/quic/ngx_event_quic_streams.c b/src/event/quic/ngx_event_quic_streams.c
index 87b6caf4e..db3208ce1 100644
--- 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, ngx_uint_t bidi)
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 *ev)
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 *c, uint64_t id)
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;