From a8457b4c3d86a42209eabe90eddb605f59041f9e Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 14 May 2021 07:23:51 +0200 Subject: [PATCH] ASN1: Fix i2d_provided() return value i2d_provided() - which is the internal provider data function for i2d_KeyParams(), i2d_PrivateKey(), i2d_PublicKey() - didn't treat the returned length from OSSL_ENCODER_to_data() quite as well as it should have. A simple added flag that records the state of |*pp| before calling OSSL_ENCODER_to_data() fixes the problem. Fixes #14655 Reviewed-by: Ben Kaduk (Merged from https://github.com/openssl/openssl/pull/15277) --- crypto/asn1/i2d_evp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crypto/asn1/i2d_evp.c b/crypto/asn1/i2d_evp.c index 2a101a6fa31..f03dcb26669 100644 --- a/crypto/asn1/i2d_evp.c +++ b/crypto/asn1/i2d_evp.c @@ -48,6 +48,7 @@ static int i2d_provided(const EVP_PKEY *a, int selection, * down, when pp != NULL. */ size_t len = INT_MAX; + int pp_was_NULL = (pp == NULL || *pp == NULL); ctx = OSSL_ENCODER_CTX_new_for_pkey(a, selection, output_info->output_type, @@ -56,7 +57,7 @@ static int i2d_provided(const EVP_PKEY *a, int selection, if (ctx == NULL) return -1; if (OSSL_ENCODER_to_data(ctx, pp, &len)) { - if (pp == NULL) + if (pp_was_NULL) ret = (int)len; else ret = INT_MAX - (int)len; -- 2.47.3