Don't decrement the unreleased counter if we failed to release a record

In a failure situation we may incorrectly decrement the amount of data
released. Only decrement the counter if we successfully released.

Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/27091)
This commit is contained in:
Matt Caswell 2025-03-18 12:05:08 +00:00 committed by Tomas Mraz
parent f2488a567b
commit 4ad45969b0

View file

@ -423,18 +423,15 @@ static int quic_release_record(OSSL_RECORD_LAYER *rl, void *rechandle,
return OSSL_RECORD_RETURN_FATAL; return OSSL_RECORD_RETURN_FATAL;
} }
rl->recunreleased -= length; if (rl->recunreleased == length) {
if (!rl->qtls->args.crypto_release_rcd_cb(rl->recread,
if (rl->recunreleased > 0) rl->qtls->args.crypto_release_rcd_cb_arg)) {
return OSSL_RECORD_RETURN_SUCCESS; QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
return OSSL_RECORD_RETURN_FATAL;
if (!rl->qtls->args.crypto_release_rcd_cb(rl->recread, }
rl->qtls->args.crypto_release_rcd_cb_arg)) { rl->recread = 0;
QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
return OSSL_RECORD_RETURN_FATAL;
} }
rl->recunreleased -= length;
rl->recread = 0;
return OSSL_RECORD_RETURN_SUCCESS; return OSSL_RECORD_RETURN_SUCCESS;
} }