From: Stephan Bosch Date: Tue, 3 Sep 2019 16:15:57 +0000 (+0200) Subject: lib: base64 - Allow encoding line endings one octet at a time. X-Git-Tag: 2.3.8~106 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ec9e358b04fd681d92a1a6cd504d067ba65590d0;p=thirdparty%2Fdovecot%2Fcore.git lib: base64 - Allow encoding line endings one octet at a time. --- diff --git a/src/lib/base64.c b/src/lib/base64.c index 9aec963b58..9518254e80 100644 --- a/src/lib/base64.c +++ b/src/lib/base64.c @@ -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; diff --git a/src/lib/base64.h b/src/lib/base64.h index 3e4e110b0e..f777619d8b 100644 --- a/src/lib/base64.h +++ b/src/lib/base64.h @@ -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;