Prevent memory leak and superfluous status notifications.
diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c
index 8a241b7..1cd383a 100644
--- a/dlls/wininet/ftp.c
+++ b/dlls/wininet/ftp.c
@@ -1486,7 +1486,8 @@
HINTERNET FTP_Connect(HINTERNET hInternet, LPCWSTR lpszServerName,
INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
- LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext)
+ LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
+ DWORD dwInternalFlags)
{
struct sockaddr_in socketAddr;
struct hostent *phe = NULL;
@@ -1567,6 +1568,7 @@
lpwfs->hdr.htype = WH_HFTPSESSION;
lpwfs->hdr.dwFlags = dwFlags;
lpwfs->hdr.dwContext = dwContext;
+ lpwfs->hdr.dwInternalFlags = dwInternalFlags;
lpwfs->hdr.lpwhparent = (LPWININETHANDLEHEADER)hInternet;
lpwfs->sndSocket = nsocket;
lpwfs->download_in_progress = NULL;
@@ -1587,7 +1589,8 @@
if (FTP_ConnectToHost(lpwfs))
{
- if (hIC->lpfnStatusCB)
+ /* Don't send a handle created callback if this handle was created with InternetOpenUrl */
+ if (hIC->lpfnStatusCB && !(lpwfs->hdr.dwInternalFlags & INET_OPENURL))
{
INTERNET_ASYNC_RESULT iar;
@@ -2499,6 +2502,7 @@
{
LPWININETFTPSESSIONA lpwfs = (LPWININETFTPSESSIONA) lpwh->hdr.lpwhparent;
INT nResCode;
+ HINTERNET handle;
TRACE("\n");
@@ -2517,7 +2521,15 @@
close(lpwh->nDataSocket);
HeapFree(GetProcessHeap(), 0, lpwh);
-
+
+ /* If this handle was opened with InternetOpenUrl, we need to close the parent to prevent
+ a memory leek
+ */
+ if(lpwfs->hdr.dwInternalFlags & INET_OPENURL)
+ {
+ handle = WININET_FindHandle( &lpwfs->hdr );
+ InternetCloseHandle(handle);
+ }
return TRUE;
}
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 0d31d64..64f87ab 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1789,7 +1789,8 @@
*/
HINTERNET HTTP_Connect(HINTERNET hInternet, LPCWSTR lpszServerName,
INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
- LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext)
+ LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
+ DWORD dwInternalFlags)
{
BOOL bSuccess = FALSE;
LPWININETAPPINFOW hIC = NULL;
@@ -1830,6 +1831,7 @@
lpwhs->hdr.lpwhparent = &hIC->hdr;
lpwhs->hdr.dwFlags = dwFlags;
lpwhs->hdr.dwContext = dwContext;
+ lpwhs->hdr.dwInternalFlags = dwInternalFlags;
if(hIC->lpszProxy && hIC->dwAccessType == INTERNET_OPEN_TYPE_PROXY) {
if(strchrW(hIC->lpszProxy, ' '))
FIXME("Several proxies not implemented.\n");
@@ -1842,7 +1844,8 @@
lpwhs->lpszUserName = WININET_strdupW(lpszUserName);
lpwhs->nServerPort = nServerPort;
- if (hIC->lpfnStatusCB)
+ /* Don't send a handle created callback if this handle was created with InternetOpenUrl */
+ if (hIC->lpfnStatusCB && !(lpwhs->hdr.dwInternalFlags & INET_OPENURL))
{
INTERNET_ASYNC_RESULT iar;
@@ -2408,6 +2411,15 @@
HeapFree(GetProcessHeap(), 0, lpwhr->pCustHeaders);
HeapFree(GetProcessHeap(), 0, lpwhr);
+
+ /* If this handle was opened with InternetOpenUrl, we need to close the parent to prevent
+ a memory leek
+ */
+ if(lpwhs->hdr.dwInternalFlags & INET_OPENURL)
+ {
+ handle = WININET_FindHandle( &lpwhs->hdr );
+ InternetCloseHandle(handle);
+ }
}
@@ -2426,10 +2438,14 @@
hIC = (LPWININETAPPINFOW) lpwhs->hdr.lpwhparent;
- handle = WININET_FindHandle( &lpwhs->hdr );
- SendAsyncCallback(hIC, handle, lpwhs->hdr.dwContext,
- INTERNET_STATUS_HANDLE_CLOSING, lpwhs,
- sizeof(HINTERNET));
+ /* Don't send a handle closing callback if this handle was created with InternetOpenUrl */
+ if(!(lpwhs->hdr.dwInternalFlags & INET_OPENURL))
+ {
+ handle = WININET_FindHandle( &lpwhs->hdr );
+ SendAsyncCallback(hIC, handle, lpwhs->hdr.dwContext,
+ INTERNET_STATUS_HANDLE_CLOSING, lpwhs,
+ sizeof(HINTERNET));
+ }
if (lpwhs->lpszServerName)
HeapFree(GetProcessHeap(), 0, lpwhs->lpszServerName);
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index ce9c261..62c9dcf 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -665,12 +665,12 @@
{
case INTERNET_SERVICE_FTP:
rc = FTP_Connect(hInternet, lpszServerName, nServerPort,
- lpszUserName, lpszPassword, dwFlags, dwContext);
+ lpszUserName, lpszPassword, dwFlags, dwContext, 0);
break;
case INTERNET_SERVICE_HTTP:
rc = HTTP_Connect(hInternet, lpszServerName, nServerPort,
- lpszUserName, lpszPassword, dwFlags, dwContext);
+ lpszUserName, lpszPassword, dwFlags, dwContext, 0);
break;
case INTERNET_SERVICE_GOPHER:
@@ -2069,8 +2069,8 @@
case INTERNET_SCHEME_FTP:
if(urlComponents.nPort == 0)
urlComponents.nPort = INTERNET_DEFAULT_FTP_PORT;
- client = InternetConnectW(hInternet, hostName, urlComponents.nPort,
- userName, password, INTERNET_SERVICE_FTP, dwFlags, dwContext);
+ client = FTP_Connect(hInternet, hostName, urlComponents.nPort,
+ userName, password, dwFlags, dwContext, INET_OPENURL);
client1 = FtpOpenFileW(client, path, GENERIC_READ, dwFlags, dwContext);
break;
@@ -2084,8 +2084,8 @@
else
urlComponents.nPort = INTERNET_DEFAULT_HTTPS_PORT;
}
- client = InternetConnectW(hInternet, hostName, urlComponents.nPort, userName,
- password, INTERNET_SERVICE_HTTP, dwFlags, dwContext);
+ client = HTTP_Connect(hInternet, hostName, urlComponents.nPort,
+ userName, password, dwFlags, dwContext, INET_OPENURL);
if(client == NULL)
break;
client1 = HttpOpenRequestW(client, NULL, path, NULL, NULL, accept, dwFlags, dwContext);
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index 3c8b8a2..1b47d86 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -81,12 +81,15 @@
WH_HHTTPREQ = INTERNET_HANDLE_TYPE_HTTP_REQUEST,
} WH_TYPE;
+#define INET_OPENURL 0x0001
+
typedef struct _WININETHANDLEHEADER
{
WH_TYPE htype;
DWORD dwFlags;
DWORD dwContext;
DWORD dwError;
+ DWORD dwInternalFlags;
struct _WININETHANDLEHEADER *lpwhparent;
} WININETHANDLEHEADER, *LPWININETHANDLEHEADER;
@@ -346,11 +349,13 @@
HINTERNET FTP_Connect(HINTERNET hInterent, LPCWSTR lpszServerName,
INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
- LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext);
+ LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
+ DWORD dwInternalFlags);
HINTERNET HTTP_Connect(HINTERNET hInterent, LPCWSTR lpszServerName,
INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
- LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext);
+ LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
+ DWORD dwInternalFlags);
BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
struct hostent **phe, struct sockaddr_in *psa);