cryptnet: InternetCrackUrlW requires component buffers when used with ICU_DECODE.

oldstable
Aric Stewart 2007-12-14 16:55:19 +09:00 committed by Alexandre Julliard
parent ba280fb1b0
commit 1f98ede4f0
1 changed files with 14 additions and 11 deletions

View File

@ -476,18 +476,16 @@ static BOOL CRYPT_CrackUrl(LPCWSTR pszURL, URL_COMPONENTSW *components)
memset(components, 0, sizeof(*components));
components->dwStructSize = sizeof(*components);
components->dwHostNameLength = 1;
components->dwUrlPathLength = 1;
components->lpszHostName = CryptMemAlloc(MAX_PATH * sizeof(WCHAR));
components->dwHostNameLength = MAX_PATH;
components->lpszUrlPath = CryptMemAlloc(MAX_PATH * 2 * sizeof(WCHAR));
components->dwUrlPathLength = 2 * MAX_PATH;
ret = InternetCrackUrlW(pszURL, 0, ICU_DECODE, components);
if (ret)
{
LPWSTR hostname = strndupW(components->lpszHostName,
components->dwHostNameLength);
LPWSTR path = strndupW(components->lpszUrlPath,
components->dwUrlPathLength);
components->lpszHostName = hostname;
components->lpszUrlPath = path;
if ((components->dwUrlPathLength == 2 * MAX_PATH - 1) ||
(components->dwHostNameLength == MAX_PATH - 1))
FIXME("Buffers are too small\n");
switch (components->nScheme)
{
case INTERNET_SCHEME_FTP:
@ -873,12 +871,16 @@ static BOOL WINAPI File_RetrieveEncodedObjectW(LPCWSTR pszURL,
*ppfnFreeObject = CRYPT_FreeBlob;
*ppvFreeContext = NULL;
components.dwUrlPathLength = 1;
components.lpszUrlPath = CryptMemAlloc(MAX_PATH * 2 * sizeof(WCHAR));
components.dwUrlPathLength = 2 * MAX_PATH;
ret = InternetCrackUrlW(pszURL, 0, ICU_DECODE, &components);
if (ret)
{
LPWSTR path;
if (components.dwUrlPathLength == 2 * MAX_PATH - 1)
FIXME("Buffers are too small\n");
/* 3 == lstrlenW(L"c:") + 1 */
path = CryptMemAlloc((components.dwUrlPathLength + 3) * sizeof(WCHAR));
if (path)
@ -932,6 +934,7 @@ static BOOL WINAPI File_RetrieveEncodedObjectW(LPCWSTR pszURL,
CryptMemFree(path);
}
}
CryptMemFree(components.lpszUrlPath);
return ret;
}
@ -952,7 +955,7 @@ static BOOL CRYPT_GetRetrieveFunction(LPCWSTR pszURL,
*pFunc = NULL;
*phFunc = 0;
components.dwSchemeLength = 1;
ret = InternetCrackUrlW(pszURL, 0, ICU_DECODE, &components);
ret = InternetCrackUrlW(pszURL, 0, 0, &components);
if (ret)
{
/* Microsoft always uses CryptInitOIDFunctionSet/