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);