X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Fbase64.c;h=cee77c3c3334c6715a9f02fecb5bc53f36203183;hb=5f5be4927abaa906a25ffb295d48ee085894c388;hp=ca6466bf22d4ed77f7c05ac15e5e3d3d87f136c1;hpb=3c51463e961cb96df8f624420f833c65505bb451;p=exim.git diff --git a/src/src/base64.c b/src/src/base64.c index ca6466bf2..cee77c3c3 100644 --- a/src/src/base64.c +++ b/src/src/base64.c @@ -5,7 +5,7 @@ /* Copyright (c) Tom Kistner 2004, 2015 */ /* License: GPL */ -/* Copyright (c) University of Cambridge 1995 - 2015 */ +/* Copyright (c) University of Cambridge 1995 - 2016 */ /* See the file NOTICE for conditions of use and distribution. */ @@ -129,7 +129,7 @@ compact loop is messy and would probably run more slowly. Arguments: code points to the coded string, zero-terminated ptr where to put the pointer to the result, which is in - dynamic store, and zero-terminated + allocated store, and zero-terminated Returns: the number of bytes in the result, or -1 if the input was malformed @@ -163,35 +163,50 @@ quantum this may decode to 1, 2, or 3 output bytes. */ while ((x = *code++) != 0) { if (isspace(x)) continue; + /* debug_printf("b64d: '%c'\n", x); */ if (x > 127 || (x = dec64table[x]) == 255) return -1; while (isspace(y = *code++)) ; + /* debug_printf("b64d: '%c'\n", y); */ if (y == 0 || (y = dec64table[y]) == 255) return -1; *result++ = (x << 2) | (y >> 4); + /* debug_printf("b64d: -> %02x\n", result[-1]); */ while (isspace(x = *code++)) ; - if (x == '=') + /* debug_printf("b64d: '%c'\n", x); */ + if (x == '=') /* endmarker, but there should be another */ { while (isspace(x = *code++)) ; - if (x != '=' || *code != 0) return -1; + /* debug_printf("b64d: '%c'\n", x); */ + if (x != '=') return -1; + while (isspace(y = *code++)) ; + if (y != 0) return -1; + /* debug_printf("b64d: DONE\n"); */ + break; } else { if (x > 127 || (x = dec64table[x]) == 255) return -1; *result++ = (y << 4) | (x >> 2); + /* debug_printf("b64d: -> %02x\n", result[-1]); */ while (isspace(y = *code++)) ; + /* debug_printf("b64d: '%c'\n", y); */ if (y == '=') { - if (*code != 0) return -1; + while (isspace(y = *code++)) ; + if (y != 0) return -1; + /* debug_printf("b64d: DONE\n"); */ + break; } else { if (y > 127 || (y = dec64table[y]) == 255) return -1; *result++ = (x << 6) | y; + /* debug_printf("b64d: -> %02x\n", result[-1]); */ } } } @@ -201,23 +216,6 @@ return result - *ptr; } -/************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - ************************************************* - *************************************************/ - /************************************************* * Encode byte-string in base 64 * *************************************************/