I tripped over this and this optimisation hurts more then it helps.
So lets just create a new EVP_ENCODE_CTX for every base64_decode()
call and cleanup at the end of the call.
--
:wq Claudio
Index: encoding.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/encoding.c,v
retrieving revision 1.10
diff -u -p -r1.10 encoding.c
--- encoding.c 24 Nov 2021 15:24:16 -0000 1.10
+++ encoding.c 19 Apr 2022 17:16:32 -0000
@@ -96,21 +96,21 @@ int
base64_decode(const unsigned char *in, size_t inlen,
unsigned char **out, size_t *outlen)
{
- static EVP_ENCODE_CTX *ctx;
- unsigned char *to;
+ EVP_ENCODE_CTX *ctx;
+ unsigned char *to = NULL;
size_t tolen;
int evplen;
- if (ctx == NULL && (ctx = EVP_ENCODE_CTX_new()) == NULL)
+ if ((ctx = EVP_ENCODE_CTX_new()) == NULL)
err(1, "EVP_ENCODE_CTX_new");
*out = NULL;
*outlen = 0;
if (base64_decode_len(inlen, &tolen) == -1)
- return -1;
+ goto fail;
if ((to = malloc(tolen)) == NULL)
- return -1;
+ goto fail;
evplen = tolen;
EVP_DecodeInit(ctx);
@@ -121,10 +121,13 @@ base64_decode(const unsigned char *in, s
goto fail;
*outlen += evplen;
*out = to;
+
+ EVP_ENCODE_CTX_free(ctx);
return 0;
fail:
free(to);
+ EVP_ENCODE_CTX_free(ctx);
return -1;
}