From: compmaniak <6314398+compmaniak@users.noreply.github.com> Date: Wed, 30 Aug 2017 22:25:22 +0000 (+0300) Subject: lib: Reduced conditional logic in base64_encode X-Git-Tag: 2.3.0.rc1~1120 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f117e2804941e1bf8bb0392cbd066218ffdbfa44;p=thirdparty%2Fdovecot%2Fcore.git lib: Reduced conditional logic in base64_encode --- diff --git a/src/lib/base64.c b/src/lib/base64.c index a645dd2fbe..d84014b7b2 100644 --- a/src/lib/base64.c +++ b/src/lib/base64.c @@ -49,32 +49,35 @@ void base64_encode(const void *src, size_t src_size, buffer_t *dest) unsigned char tmp[4]; size_t src_pos; - for (src_pos = 0; src_pos < src_size; ) { + for (src_pos = 0; src_size - src_pos > 2; src_pos += 3) { tmp[0] = b64enc[src_c[src_pos] >> 2]; - switch (src_size - src_pos) { - case 1: - tmp[1] = b64enc[(src_c[src_pos] & 0x03) << 4]; - tmp[2] = '='; - tmp[3] = '='; - src_pos++; - break; - case 2: - tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) | - (src_c[src_pos+1] >> 4)]; - tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2)]; - tmp[3] = '='; - src_pos += 2; - break; - default: - tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) | - (src_c[src_pos+1] >> 4)]; - tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2) | - ((src_c[src_pos+2] & 0xc0) >> 6)]; - tmp[3] = b64enc[src_c[src_pos+2] & 0x3f]; - src_pos += 3; - break; - } + tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) | + (src_c[src_pos+1] >> 4)]; + tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2) | + ((src_c[src_pos+2] & 0xc0) >> 6)]; + tmp[3] = b64enc[src_c[src_pos+2] & 0x3f]; + buffer_append(dest, tmp, 4); + } + switch (src_size - src_pos) { + case 0: + break; + case 1: + tmp[0] = b64enc[src_c[src_pos] >> 2]; + tmp[1] = b64enc[(src_c[src_pos] & 0x03) << 4]; + tmp[2] = '='; + tmp[3] = '='; + buffer_append(dest, tmp, 4); + break; + case 2: + tmp[0] = b64enc[src_c[src_pos] >> 2]; + tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) | + (src_c[src_pos+1] >> 4)]; + tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2)]; + tmp[3] = '='; buffer_append(dest, tmp, 4); + break; + default: + i_unreached(); } }