crypt32: Fix length-handling of 'decodeBase64Block'
Christian Inci
chris.pcguy.inci at gmail.com
Sat Apr 16 17:00:18 CDT 2011
---
dlls/crypt32/base64.c | 5 ++---
dlls/crypt32/tests/base64.c | 20 ++++++++++++++++++--
2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/dlls/crypt32/base64.c b/dlls/crypt32/base64.c
index 5d0d604..961ac61 100644
--- a/dlls/crypt32/base64.c
+++ b/dlls/crypt32/base64.c
@@ -502,11 +502,10 @@ static LONG decodeBase64Block(const char *in_buf,
int in_len,
const char *d = in_buf;
int ip0, ip1, ip2, ip3;
- if (len < 4)
- return ERROR_INVALID_DATA;
-
if (d[2] == '=')
{
+ if (len == 3)
+ return ERROR_INVALID_DATA;
if ((ip0 = decodeBase64Byte(d[0])) > 63)
return ERROR_INVALID_DATA;
if ((ip1 = decodeBase64Byte(d[1])) > 63)
diff --git a/dlls/crypt32/tests/base64.c b/dlls/crypt32/tests/base64.c
index 39fa2e1..55ba1d4 100644
--- a/dlls/crypt32/tests/base64.c
+++ b/dlls/crypt32/tests/base64.c
@@ -350,9 +350,25 @@ static void testStringToBinaryA(void)
/* Bogus length--oddly enough, that succeeds, even though it's not
* properly padded.
*/
+ ret = pCryptStringToBinaryA(tests[i].base64, 0,
CRYPT_STRING_BASE64,
+ NULL, &bufLen, NULL, NULL);
+ ok(ret, "CryptStringToBinaryA failed: %d\n", GetLastError());
ret = pCryptStringToBinaryA(tests[i].base64, 1,
CRYPT_STRING_BASE64,
NULL, &bufLen, NULL, NULL);
- todo_wine ok(ret, "CryptStringToBinaryA failed: %d\n",
GetLastError());
+ ok(ret, "CryptStringToBinaryA failed: %d\n", GetLastError());
+ ret = pCryptStringToBinaryA(tests[i].base64, 2,
CRYPT_STRING_BASE64,
+ NULL, &bufLen, NULL, NULL);
+ ok(ret, "CryptStringToBinaryA failed: %d\n", GetLastError());
+ ret = pCryptStringToBinaryA(tests[i].base64, 3,
CRYPT_STRING_BASE64,
+ NULL, &bufLen, NULL, NULL);
+ if (i == 0)
+ ok(!ret && GetLastError() == ERROR_INVALID_DATA,
+ "Expected ERROR_INVALID_DATA, got %d\n", GetLastError());
+ else
+ ok(ret, "CryptStringToBinaryA failed: %d\n", GetLastError());
+ ret = pCryptStringToBinaryA(tests[i].base64, 4,
CRYPT_STRING_BASE64,
+ NULL, &bufLen, NULL, NULL);
+ ok(ret, "CryptStringToBinaryA failed: %d\n", GetLastError());
/* Check with the precise format */
decodeAndCompareBase64_A(tests[i].base64, NULL, NULL,
CRYPT_STRING_BASE64, CRYPT_STRING_BASE64, tests[i].toEncode,
@@ -406,7 +422,7 @@ static void testStringToBinaryA(void)
*/
ret = pCryptStringToBinaryA(testsNoCR[i].base64, 1,
CRYPT_STRING_BASE64,
NULL, &bufLen, NULL, NULL);
- todo_wine ok(ret, "CryptStringToBinaryA failed: %d\n",
GetLastError());
+ ok(ret, "CryptStringToBinaryA failed: %d\n", GetLastError());
/* Check with the precise format */
decodeAndCompareBase64_A(testsNoCR[i].base64, NULL, NULL,
CRYPT_STRING_BASE64, CRYPT_STRING_BASE64, testsNoCR[i].toEncode,
--
1.7.5.rc1
More information about the wine-patches
mailing list