| Index: Source/wtf/text/Base64.cpp | 
| diff --git a/Source/wtf/text/Base64.cpp b/Source/wtf/text/Base64.cpp | 
| index 4d1c88ea022160899c9deea84a1415715aa1972c..d7e6e9164dd8601733e537dc87c8552ee6f7c1c8 100644 | 
| --- a/Source/wtf/text/Base64.cpp | 
| +++ b/Source/wtf/text/Base64.cpp | 
| @@ -128,7 +128,7 @@ void base64Encode(const char* data, unsigned len, Vector<char>& out, Base64Encod | 
| } | 
| } | 
|  | 
| -bool base64Decode(const Vector<char>& in, Vector<char>& out, Base64DecodePolicy policy) | 
| +bool base64Decode(const Vector<char>& in, Vector<char>& out, Base64InvalidCharactersPolicy charactersPolicy, Base64PaddingValidationPolicy paddingPolicy) | 
| { | 
| out.clear(); | 
|  | 
| @@ -136,30 +136,43 @@ bool base64Decode(const Vector<char>& in, Vector<char>& out, Base64DecodePolicy | 
| if (in.size() > UINT_MAX) | 
| return false; | 
|  | 
| -    return base64Decode(in.data(), in.size(), out, policy); | 
| +    return base64Decode(in.data(), in.size(), out, charactersPolicy, paddingPolicy); | 
| } | 
|  | 
| template<typename T> | 
| -static inline bool base64DecodeInternal(const T* data, unsigned len, Vector<char>& out, Base64DecodePolicy policy) | 
| +static inline bool base64DecodeInternal(const T* data, unsigned length, Vector<char>& out, Base64InvalidCharactersPolicy charactersPolicy, Base64PaddingValidationPolicy paddingPolicy) | 
| { | 
| out.clear(); | 
| -    if (!len) | 
| +    if (!length) | 
| return true; | 
|  | 
| -    out.grow(len); | 
| +    unsigned dataLength = length; | 
| +    if (paddingPolicy == Base64StrictPaddingValidation) { | 
| +        if (!(dataLength % 4)) { | 
| +            // There may be 2 = padding max. | 
| +            while (data[dataLength - 1] == '=' && dataLength >= (length - 2)) | 
| +                --dataLength; | 
| +        } | 
| +        if (dataLength % 4 == 1) | 
| +            return false; | 
| +    } | 
| + | 
| +    out.grow(length); | 
|  | 
| bool sawEqualsSign = false; | 
| unsigned outLength = 0; | 
| -    for (unsigned idx = 0; idx < len; ++idx) { | 
| +    for (unsigned idx = 0; idx < length; ++idx) { | 
| unsigned ch = data[idx]; | 
| -        if (ch == '=') | 
| +        if (ch == '=') { | 
| sawEqualsSign = true; | 
| -        else if (('0' <= ch && ch <= '9') || ('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z') || ch == '+' || ch == '/') { | 
| +            if (paddingPolicy == Base64StrictPaddingValidation && idx < dataLength) | 
| +                return false; | 
| +        } else if (('0' <= ch && ch <= '9') || ('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z') || ch == '+' || ch == '/') { | 
| if (sawEqualsSign) | 
| return false; | 
| out[outLength] = base64DecMap[ch]; | 
| ++outLength; | 
| -        } else if (policy == Base64FailOnInvalidCharacter || (policy == Base64IgnoreWhitespace && !isSpaceOrNewline(ch))) | 
| +        } else if (charactersPolicy == Base64FailOnInvalidCharacter || (charactersPolicy == Base64IgnoreWhitespace && !isSpaceOrNewline(ch))) | 
| return false; | 
| } | 
|  | 
| @@ -199,18 +212,18 @@ static inline bool base64DecodeInternal(const T* data, unsigned len, Vector<char | 
| return true; | 
| } | 
|  | 
| -bool base64Decode(const char* data, unsigned length, Vector<char>& out, Base64DecodePolicy policy) | 
| +bool base64Decode(const char* data, unsigned length, Vector<char>& out, Base64InvalidCharactersPolicy charactersPolicy, Base64PaddingValidationPolicy paddingPolicy) | 
| { | 
| -    return base64DecodeInternal<LChar>(reinterpret_cast<const LChar*>(data), length, out, policy); | 
| +    return base64DecodeInternal<LChar>(reinterpret_cast<const LChar*>(data), length, out, charactersPolicy, paddingPolicy); | 
| } | 
|  | 
| -bool base64Decode(const String& in, Vector<char>& out, Base64DecodePolicy policy) | 
| +bool base64Decode(const String& in, Vector<char>& out, Base64InvalidCharactersPolicy charactersPolicy, Base64PaddingValidationPolicy paddingPolicy) | 
| { | 
| if (in.isEmpty()) | 
| -        return base64DecodeInternal<LChar>(0, 0, out, policy); | 
| +        return base64DecodeInternal<LChar>(0, 0, out, charactersPolicy, paddingPolicy); | 
| if (in.is8Bit()) | 
| -        return base64DecodeInternal<LChar>(in.characters8(), in.length(), out, policy); | 
| -    return base64DecodeInternal<UChar>(in.characters16(), in.length(), out, policy); | 
| +        return base64DecodeInternal<LChar>(in.characters8(), in.length(), out, charactersPolicy, paddingPolicy); | 
| +    return base64DecodeInternal<UChar>(in.characters16(), in.length(), out, charactersPolicy, paddingPolicy); | 
| } | 
|  | 
| } // namespace WTF | 
|  |