PATCH: InternetCloseHandle

Marcus Meissner mm at lst.de
Sat Jul 13 02:29:08 CDT 2002


Hi,

The Lotus Smartsuite installer does:
	LoadLibrary("wininet");
	func = GetProcAddress("InternetCloseHandle");
	func(handlevalue);

with a random handlevalue. This is obviously incorrect and should be
caught.

Ciao, Marcus

License: LGPL
Changelog:
	Protect InternetCloseHandle() against invalid handles.

Index: internet.c
===================================================================
RCS file: /home/wine/wine/dlls/wininet/internet.c,v
retrieving revision 1.35
diff -u -r1.35 internet.c
--- internet.c	21 Jun 2002 23:59:49 -0000	1.35
+++ internet.c	13 Jul 2002 07:23:12 -0000
@@ -46,6 +46,9 @@
 #define NO_SHLWAPI_STREAM
 #include "shlwapi.h"
 
+#include "wine/exception.h"
+#include "msvcrt/excpt.h"
+
 #include "internet.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(wininet);
@@ -57,6 +60,15 @@
 #define GET_HWININET_FROM_LPWININETFINDNEXT(lpwh) \
 (LPWININETAPPINFOA)(((LPWININETFTPSESSIONA)(lpwh->hdr.lpwhparent))->hdr.lpwhparent)
 
+/* filter for page-fault exceptions */
+static WINE_EXCEPTION_FILTER(page_fault)
+{
+    if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ||
+        GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION)
+        return EXCEPTION_EXECUTE_HANDLER;
+    return EXCEPTION_CONTINUE_SEARCH;
+}
+
 typedef struct
 {
     DWORD  dwError;
@@ -455,37 +467,43 @@
     if (NULL == lpwh)
         return FALSE;
 
-    /* Clear any error information */
-    INTERNET_SetLastError(0);
-
-    switch (lpwh->htype)
-    {
-        case WH_HINIT:
-            INTERNET_CloseHandle((LPWININETAPPINFOA) lpwh);
-	    retval = TRUE;
-            break;
-
-        case WH_HHTTPSESSION:
-	    HTTP_CloseHTTPSessionHandle((LPWININETHTTPSESSIONA) lpwh);
-	    retval = TRUE;
-	    break;
-
-        case WH_HHTTPREQ:
-            HTTP_CloseHTTPRequestHandle((LPWININETHTTPREQA) lpwh);
-	    retval = TRUE;
-            break;
-
-        case WH_HFTPSESSION:
-            retval = FTP_CloseSessionHandle((LPWININETFTPSESSIONA) lpwh);
-            break;
-
-        case WH_HFINDNEXT:
-            retval = FTP_CloseFindNextHandle((LPWININETFINDNEXTA) lpwh);
-            break;
-
-        default:
-            break;
+    __TRY {
+	/* Clear any error information */
+	INTERNET_SetLastError(0);
+
+	switch (lpwh->htype)
+	{
+	    case WH_HINIT:
+		INTERNET_CloseHandle((LPWININETAPPINFOA) lpwh);
+		retval = TRUE;
+		break;
+
+	    case WH_HHTTPSESSION:
+		HTTP_CloseHTTPSessionHandle((LPWININETHTTPSESSIONA) lpwh);
+		retval = TRUE;
+		break;
+
+	    case WH_HHTTPREQ:
+		HTTP_CloseHTTPRequestHandle((LPWININETHTTPREQA) lpwh);
+		retval = TRUE;
+		break;
+
+	    case WH_HFTPSESSION:
+		retval = FTP_CloseSessionHandle((LPWININETFTPSESSIONA) lpwh);
+		break;
+
+	    case WH_HFINDNEXT:
+		retval = FTP_CloseFindNextHandle((LPWININETFINDNEXTA) lpwh);
+		break;
+
+	    default:
+		break;
+	}
+    } __EXCEPT(page_fault) {
+	INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
+	retval = FALSE;
     }
+    __ENDTRY
 
     return retval;
 }



More information about the wine-patches mailing list