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