summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/event/quic/ngx_event_quic.c4
-rw-r--r--src/event/quic/ngx_event_quic_ack.c1
-rw-r--r--src/event/quic/ngx_event_quic_streams.c18
3 files changed, 16 insertions, 7 deletions
diff --git a/src/event/quic/ngx_event_quic.c b/src/event/quic/ngx_event_quic.c
index b4033bc3f..b559c485d 100644
--- a/src/event/quic/ngx_event_quic.c
+++ b/src/event/quic/ngx_event_quic.c
@@ -844,7 +844,7 @@ ngx_quic_handle_packet(ngx_connection_t *c, ngx_quic_conf_t *conf,
"quic stateless reset packet detected");
qc->draining = 1;
- ngx_quic_close_connection(c, NGX_OK);
+ ngx_post_event(&qc->close, &ngx_posted_events);
return NGX_OK;
}
@@ -1390,7 +1390,7 @@ ngx_quic_handle_frames(ngx_connection_t *c, ngx_quic_header_t *pkt)
if (do_close) {
qc->draining = 1;
- ngx_quic_close_connection(c, NGX_OK);
+ ngx_post_event(&qc->close, &ngx_posted_events);
}
if (pkt->path != qc->path && nonprobing) {
diff --git a/src/event/quic/ngx_event_quic_ack.c b/src/event/quic/ngx_event_quic_ack.c
index 062b065f9..21ee888c9 100644
--- a/src/event/quic/ngx_event_quic_ack.c
+++ b/src/event/quic/ngx_event_quic_ack.c
@@ -806,6 +806,7 @@ void ngx_quic_lost_handler(ngx_event_t *ev)
if (ngx_quic_detect_lost(c, NULL) != NGX_OK) {
ngx_quic_close_connection(c, NGX_ERROR);
+ return;
}
ngx_quic_connstate_dbg(c);
diff --git a/src/event/quic/ngx_event_quic_streams.c b/src/event/quic/ngx_event_quic_streams.c
index 6664dfd7b..b4b0eda05 100644
--- a/src/event/quic/ngx_event_quic_streams.c
+++ b/src/event/quic/ngx_event_quic_streams.c
@@ -1084,7 +1084,8 @@ ngx_quic_stream_cleanup_handler(void *data)
{
ngx_connection_t *c = data;
- ngx_quic_stream_t *qs;
+ ngx_quic_stream_t *qs;
+ ngx_quic_connection_t *qc;
qs = c->quic;
@@ -1092,16 +1093,23 @@ ngx_quic_stream_cleanup_handler(void *data)
"quic stream id:0x%xL cleanup", qs->id);
if (ngx_quic_shutdown_stream(c, NGX_RDWR_SHUTDOWN) != NGX_OK) {
- ngx_quic_close_connection(c, NGX_ERROR);
- return;
+ goto failed;
}
qs->connection = NULL;
if (ngx_quic_close_stream(qs) != NGX_OK) {
- ngx_quic_close_connection(c, NGX_ERROR);
- return;
+ goto failed;
}
+
+ return;
+
+failed:
+
+ qc = ngx_quic_get_connection(qs->parent);
+ qc->error = NGX_QUIC_ERR_INTERNAL_ERROR;
+
+ ngx_post_event(&qc->close, &ngx_posted_events);
}