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