diff options
author | Hugo Landau <hlandau@openssl.org> | 2022-11-18 17:25:25 +0000 |
---|---|---|
committer | Hugo Landau <hlandau@openssl.org> | 2023-01-13 13:20:17 +0000 |
commit | 4e64437a5fdf5c8ff1b5c2cede6c358a19a28e85 (patch) | |
tree | 2a683c9bfde7f00694179b98433aaa1869e295b4 /ssl | |
parent | d7668ff21328c03f137d665b37f228e7c1f7a32a (diff) |
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.c | 24 | ||||
-rw-r--r-- | ssl/quic/quic_channel_local.h | 6 |
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 |