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