summaryrefslogtreecommitdiff
path: root/ssl
diff options
context:
space:
mode:
authorHugo Landau <hlandau@openssl.org>2022-11-18 17:25:25 +0000
committerHugo Landau <hlandau@openssl.org>2023-01-13 13:20:17 +0000
commit4e64437a5fdf5c8ff1b5c2cede6c358a19a28e85 (patch)
tree2a683c9bfde7f00694179b98433aaa1869e295b4 /ssl
parentd7668ff21328c03f137d665b37f228e7c1f7a32a (diff)
downloadopenssl-new-4e64437a5fdf5c8ff1b5c2cede6c358a19a28e85.tar.gz
QUIC_CHANNEL: Handle deferred packet processing after yielding of secrets correctly
Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/19703)
Diffstat (limited to 'ssl')
-rw-r--r--ssl/quic/quic_channel.c24
-rw-r--r--ssl/quic/quic_channel_local.h6
2 files changed, 23 insertions, 7 deletions
diff --git a/ssl/quic/quic_channel.c b/ssl/quic/quic_channel.c
index 7da3095ee1..04f87c9292 100644
--- a/ssl/quic/quic_channel.c
+++ b/ssl/quic/quic_channel.c
@@ -531,6 +531,7 @@ static int ch_on_handshake_yield_secret(uint32_t enc_level, int direction,
return 0;
}
+ ch->have_new_secret = 1;
return 1;
}
@@ -1007,14 +1008,23 @@ static void ch_tick(QUIC_TICK_RESULT *res, void *arg)
}
}
- /* Handle any incoming data from the network. */
- ch_rx(ch);
+ do {
+ /* Handle any incoming data from the network. */
+ ch_rx(ch);
- /*
- * Allow the handshake layer to check for any new incoming data and generate
- * new outgoing data.
- */
- ossl_quic_dhs_tick(ch->dhs);
+ /*
+ * Allow the handshake layer to check for any new incoming data and generate
+ * new outgoing data.
+ */
+ ch->have_new_secret = 0;
+ ossl_quic_dhs_tick(ch->dhs);
+
+ /*
+ * If the handshake layer gave us a new secret, we need to do RX again
+ * because packets that were not previously processable and were
+ * deferred might now be processable.
+ */
+ } while (ch->have_new_secret);
/*
* Handle any timer events which are due to fire; namely, the loss detection
diff --git a/ssl/quic/quic_channel_local.h b/ssl/quic/quic_channel_local.h
index 5859c0391a..88e49d588c 100644
--- a/ssl/quic/quic_channel_local.h
+++ b/ssl/quic/quic_channel_local.h
@@ -263,6 +263,12 @@ struct quic_channel_st {
/* Are we in server mode? Never changes after instantiation. */
unsigned int is_server : 1;
+
+ /*
+ * Set temporarily when the handshake layer has given us a new secret. Used
+ * to determine if we need to check our RX queues again.
+ */
+ unsigned int have_new_secret : 1;
};
# endif