Mercurial > dovecot > core-2.3
changeset 26307:b0e35666fc6d
lib: base64 - Truly fix dest buffer assertion in base64_decode_more().
Previous fix was inadequate in the presence of padding at the end of input.
author | Stephan Bosch <stephan.bosch@open-xchange.com> |
---|---|
date | Wed, 04 Sep 2019 18:34:30 +0200 |
parents | 17857f1d7e94 |
children | 64deaaa15407 |
files | src/lib/base64.c src/lib/test-base64.c |
diffstat | 2 files changed, 19 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/base64.c Thu Sep 05 14:21:53 2019 +0200 +++ b/src/lib/base64.c Wed Sep 04 18:34:30 2019 +0200 @@ -561,6 +561,12 @@ continue; } + if (dst_avail == 0) { + i_assert(src_pos_r != NULL); + *src_pos_r = src_pos; + return 1; + } + switch (dec->sub_pos) { case 0: dec->buf = dm; @@ -590,13 +596,6 @@ default: i_unreached(); } - if (dst_avail == 0) { - if (src_pos_r != NULL) - *src_pos_r = src_pos + 1; - else - i_assert(src_pos + 1 == src_size); - return 1; - } } if (dec->seen_padding) {
--- a/src/lib/test-base64.c Thu Sep 05 14:21:53 2019 +0200 +++ b/src/lib/test-base64.c Wed Sep 04 18:34:30 2019 +0200 @@ -834,18 +834,27 @@ { struct base64_encoder enc; struct base64_decoder dec; + void *space; + size_t enc_size; + buffer_t buf; int ret; buffer_set_used_size(buf1, 0); buffer_set_used_size(buf2, 0); base64_encode_init(&enc, b64, enc_flags, max_line_len); - base64_encode_more(&enc, in_buf, in_buf_size, NULL, buf1); - base64_encode_finish(&enc, buf1); + enc_size = base64_get_full_encoded_size(&enc, in_buf_size); + space = buffer_append_space_unsafe(buf1, enc_size); + buffer_create_from_data(&buf, space, enc_size); + + base64_encode_more(&enc, in_buf, in_buf_size, NULL, &buf); + base64_encode_finish(&enc, &buf); base64_decode_init(&dec, b64, dec_flags); - ret = base64_decode_more(&dec, buf1->data, buf1->used, - NULL, buf2); + space = buffer_append_space_unsafe(buf2, in_buf_size); + buffer_create_from_data(&buf, space, in_buf_size); + + ret = base64_decode_more(&dec, buf1->data, buf1->used, NULL, &buf); if (ret >= 0) ret = base64_decode_finish(&dec);