From: Tomas Mraz Date: Mon, 5 Jan 2026 17:22:30 +0000 (+0100) Subject: b64_ctrl(): Do not try to call EVP_Encode functions when not writing X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84eb1d3ac2b199adcf506890ccf5d150df64f234;p=thirdparty%2Fopenssl.git b64_ctrl(): Do not try to call EVP_Encode functions when not writing The BIO_CTRL_FLUSH should just forward the call to the underlying BIOs when not writing. Reviewed-by: Saša Nedvědický Reviewed-by: Paul Dale Reviewed-by: Matt Caswell MergeDate: Mon Jan 19 14:20:35 2026 (Merged from https://github.com/openssl/openssl/pull/29550) --- diff --git a/crypto/evp/bio_b64.c b/crypto/evp/bio_b64.c index 2eab67caba7..20cf570fe35 100644 --- a/crypto/evp/bio_b64.c +++ b/crypto/evp/bio_b64.c @@ -469,19 +469,20 @@ static long b64_ctrl(BIO *b, int cmd, long num, void *ptr) ret = BIO_ctrl(next, cmd, num, ptr); break; case BIO_CTRL_FLUSH: - /* do a final write */ - again: - while (ctx->buf_len != ctx->buf_off) { - i = b64_write(b, NULL, 0); - if (i < 0) - return i; - } - if (ctx->encode != B64_NONE - && EVP_ENCODE_CTX_num(ctx->base64) != 0) { - ctx->buf_off = 0; - EVP_EncodeFinal(ctx->base64, ctx->buf, &(ctx->buf_len)); - /* push out the bytes */ - goto again; + if (ctx->encode == B64_ENCODE) { + /* do a final write */ + again: + while (ctx->buf_len != ctx->buf_off) { + i = b64_write(b, NULL, 0); + if (i < 0) + return i; + } + if (EVP_ENCODE_CTX_num(ctx->base64) != 0) { + ctx->buf_off = 0; + EVP_EncodeFinal(ctx->base64, ctx->buf, &(ctx->buf_len)); + /* push out the bytes */ + goto again; + } } /* Finally flush the underlying BIO */ ret = BIO_ctrl(next, cmd, num, ptr);