summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2021-05-14 07:23:51 +0200
committerBenjamin Kaduk <bkaduk@akamai.com>2021-05-15 13:16:31 -0700
commita8457b4c3d86a42209eabe90eddb605f59041f9e (patch)
tree9ce599e1c95035339e9e3b54b214269b362de492 /crypto
parent522827160936319841f3f83fd246f92da96f5686 (diff)
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 <kaduk@mit.edu> (Merged from https://github.com/openssl/openssl/pull/15277)
Diffstat (limited to 'crypto')
-rw-r--r--crypto/asn1/i2d_evp.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/crypto/asn1/i2d_evp.c b/crypto/asn1/i2d_evp.c
index 2a101a6fa3..f03dcb2666 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;