On Tue, Apr 19, 2022 at 07:24:04PM +0200, Claudio Jeker wrote:
> 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.
Should malloc() failure and EVP_ENCODE_CTX_new() failure not be treated
the same way? Either both return -1 or both err()?
ok either way
>
> --
> :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;
> }
>
>