X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=base64.c;h=a8c7f1c156182f6dfde33a93f0d059bf8ed4ff7e;hb=d88fabcc5f6991c32c9d995b3ef271b87d1491f8;hp=1dc533dd003d1b89d12d49bbd151626785d1beaa;hpb=3d58a7d4e185fdd98cad23b8896cddfab0de594c;p=~andy%2Ffetchmail diff --git a/base64.c b/base64.c index 1dc533dd..a8c7f1c1 100644 --- a/base64.c +++ b/base64.c @@ -52,8 +52,9 @@ void to64frombits(unsigned char *out, const unsigned char *in, int inlen) *out = '\0'; } -int from64tobits(char *out, const char *in) +int from64tobits(char *out, const char *in, int maxlen) /* base 64 to raw bytes in quasi-big-endian order, returning count of bytes */ +/* maxlen limits output buffer size, set to zero to ignore */ { int len = 0; register unsigned char digit1, digit2, digit3, digit4; @@ -77,16 +78,22 @@ int from64tobits(char *out, const char *in) if (digit4 != '=' && DECODE64(digit4) == BAD) return(-1); in += 4; - *out++ = (DECODE64(digit1) << 2) | (DECODE64(digit2) >> 4); ++len; + if (maxlen && len > maxlen) + return(-1); + *out++ = (DECODE64(digit1) << 2) | (DECODE64(digit2) >> 4); if (digit3 != '=') { - *out++ = ((DECODE64(digit2) << 4) & 0xf0) | (DECODE64(digit3) >> 2); ++len; + if (maxlen && len > maxlen) + return(-1); + *out++ = ((DECODE64(digit2) << 4) & 0xf0) | (DECODE64(digit3) >> 2); if (digit4 != '=') { + ++len; + if (maxlen && len > maxlen) + return(-1); *out++ = ((DECODE64(digit3) << 6) & 0xc0) | DECODE64(digit4); - ++len; } } } while