]> Pileus Git - ~andy/fetchmail/blobdiff - base64.c
Markup cleanup.
[~andy/fetchmail] / base64.c
index 1dc533dd003d1b89d12d49bbd151626785d1beaa..a8c7f1c156182f6dfde33a93f0d059bf8ed4ff7e 100644 (file)
--- 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