X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d05005c11f6c702273be30d4c306e94081df06aa..bf2c43c76e2819be443ab1d830ab68d9569d66b1:/src/common/base64.cpp?ds=sidebyside diff --git a/src/common/base64.cpp b/src/common/base64.cpp index 2fb58c5b29..5ee3a7a3c7 100644 --- a/src/common/base64.cpp +++ b/src/common/base64.cpp @@ -3,12 +3,15 @@ // Purpose: implementation of BASE64 encoding/decoding functions // Author: Charles Reimers, Vadim Zeitlin // Created: 2007-06-18 -// RCS-ID: $Id$ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + #if wxUSE_BASE64 #include "wx/base64.h" @@ -16,9 +19,9 @@ size_t wxBase64Encode(char *dst, size_t dstLen, const void *src_, size_t srcLen) { - wxCHECK_MSG( src_, wxCONV_FAILED, _T("NULL input buffer") ); + wxCHECK_MSG( src_, wxCONV_FAILED, wxT("NULL input buffer") ); - const unsigned char *src = wx_static_cast(const unsigned char *, src_); + const unsigned char *src = static_cast(src_); static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -69,9 +72,9 @@ wxBase64Decode(void *dst_, size_t dstLen, wxBase64DecodeMode mode, size_t *posErr) { - wxCHECK_MSG( src, wxCONV_FAILED, _T("NULL input buffer") ); + wxCHECK_MSG( src, wxCONV_FAILED, wxT("NULL input buffer") ); - unsigned char *dst = wx_static_cast(unsigned char *, dst_); + unsigned char *dst = static_cast(dst_); size_t decLen = 0; @@ -118,7 +121,7 @@ wxBase64Decode(void *dst_, size_t dstLen, const char *p; for ( p = src; srcLen; p++, srcLen-- ) { - const unsigned char c = decode[(int)*p]; // cast to suppress warnings + const unsigned char c = decode[static_cast(*p)]; switch ( c ) { case WSP: @@ -132,7 +135,7 @@ wxBase64Decode(void *dst_, size_t dstLen, // force the loop to stop and an error to be returned n = -1; - srcLen = 0; + srcLen = 1; break; case PAD: @@ -156,7 +159,7 @@ wxBase64Decode(void *dst_, size_t dstLen, { // force the loop terminate with an error n = -1; - srcLen = 0; + srcLen = 1; } break; @@ -165,7 +168,7 @@ wxBase64Decode(void *dst_, size_t dstLen, { // nothing is allowed after the end so provoke error return n = -1; - srcLen = 0; + srcLen = 1; break; } @@ -183,8 +186,15 @@ wxBase64Decode(void *dst_, size_t dstLen, // undo the bit shifting done during encoding *dst++ = in[0] << 2 | in[1] >> 4; - *dst++ = in[1] << 4 | in[2] >> 2; - *dst++ = in[2] << 6 | in[3]; + + // be careful to not overwrite the output buffer with NUL pad + // bytes + if ( padLen != 2 ) + { + *dst++ = in[1] << 4 | in[2] >> 2; + if ( !padLen ) + *dst++ = in[2] << 6 | in[3]; + } } n = 0; @@ -194,7 +204,11 @@ wxBase64Decode(void *dst_, size_t dstLen, if ( n ) { if ( posErr ) - *posErr = p - src; + { + // notice that the error was on a previous position as we did one + // extra "p++" in the loop line after it + *posErr = p - src - 1; + } return wxCONV_FAILED; } @@ -208,7 +222,7 @@ wxMemoryBuffer wxBase64Decode(const char *src, size_t *posErr) { wxMemoryBuffer buf; - wxCHECK_MSG( src, buf, _T("NULL input buffer") ); + wxCHECK_MSG( src, buf, wxT("NULL input buffer") ); if ( srcLen == wxNO_LEN ) srcLen = strlen(src);