Commit 84eb1d3ac2 for openssl.org
commit 84eb1d3ac2b199adcf506890ccf5d150df64f234
Author: Tomas Mraz <tomas@openssl.org>
Date: Mon Jan 5 18:22:30 2026 +0100
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ý <sashan@openssl.org>
Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Matt Caswell <matt@openssl.org>
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 2eab67caba..20cf570fe3 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);