]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Ignore bad symbols on base64 decoding
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 13 Dec 2016 17:39:51 +0000 (17:39 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 13 Dec 2016 17:39:51 +0000 (17:39 +0000)
src/libcryptobox/base64/ref.c

index 22cedee6a9f5423133d37431d1d6ee3bc0ca2bf5..13e3b1040dd06e4d44033a8a39c2a4ba5b9d3c90 100644 (file)
@@ -119,6 +119,7 @@ base64_decode_ref (const char *in, size_t inlen,
        size_t outl = 0;
        size_t leftover = 0;
 
+repeat:
        switch (leftover) {
                for (;;) {
                case 0:
@@ -133,7 +134,7 @@ base64_decode_ref (const char *in, size_t inlen,
                                break;
                        }
                        if ((q = base64_table_dec[*c++]) >= 254) {
-
+                               ret = 0;
                                break;
                        }
                        carry = q << 2;
@@ -145,7 +146,8 @@ base64_decode_ref (const char *in, size_t inlen,
                                break;
                        }
                        if ((q = base64_table_dec[*c++]) >= 254) {
-                               return (-1);
+                               ret = 0;
+                               break;
                        }
                        *o++ = carry | (q >> 4);
                        carry = q << 4;
@@ -202,6 +204,18 @@ base64_decode_ref (const char *in, size_t inlen,
                }
        }
 
+       if (!ret && inlen > 0) {
+               /* Skip to the next valid character in input */
+               while (base64_table_dec[*c] >= 254 && inlen > 0) {
+                       c ++;
+                       inlen --;
+               }
+
+               if (inlen > 0) {
+                       goto repeat;
+               }
+       }
+
        *outlen = outl;
 
        return ret;