]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: base64 - Allow encoding line endings one octet at a time.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 3 Sep 2019 16:15:57 +0000 (18:15 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 10 Sep 2019 07:02:37 +0000 (10:02 +0300)
src/lib/base64.c
src/lib/base64.h

index 9aec963b58d71f629605b8a9cee8b0debedd2e4e..9518254e802542a4f283c765402bff3864904f42 100644 (file)
@@ -327,14 +327,20 @@ bool base64_encode_more(struct base64_encoder *enc,
                        dst_avail -= written;
                }
 
+               if (dst_avail == 0)
+                       break;
+
+               i_assert(enc->w_buf_len < sizeof(enc->w_buf));
                if (src_size > 0 && enc->cur_line_len == enc->max_line_len) {
                        if (HAS_ALL_BITS(enc->flags, BASE64_ENCODE_FLAG_CRLF)) {
-                               if (dst_avail < 2)
-                                       break;
-                               buffer_append(dest, "\r\n", 2);
+                               if (dst_avail >= 2)
+                                       buffer_append(dest, "\r\n", 2);
+                               else {
+                                       buffer_append_c(dest, '\r');
+                                       enc->w_buf[enc->w_buf_len] = '\n';
+                                       enc->w_buf_len++;
+                               }
                        } else {
-                               if (dst_avail < 1)
-                                       break;
                                buffer_append_c(dest, '\n');
                        }
                        enc->cur_line_len = 0;
index 3e4e110b0edd45006ae9045ef8380daac5806c9b..f777619d8bdfe624018f7db4a39ce3d0f4b70cee 100644 (file)
@@ -38,7 +38,7 @@ struct base64_encoder {
        unsigned char buf;
        size_t cur_line_len;
 
-       unsigned char w_buf[4];
+       unsigned char w_buf[5];
        unsigned int w_buf_len;
 
        bool finished:1;