[WS2_32_NEW]

- Add missing SEH in getsockopt/setsockopt
CORE-10440

svn path=/trunk/; revision=69823
This commit is contained in:
Thomas Faber 2015-11-07 08:30:00 +00:00
parent e67e24eeca
commit facf3ecba9
3 changed files with 75 additions and 28 deletions

View file

@ -51,7 +51,7 @@ add_library(ws2_32_new SHARED
${CMAKE_CURRENT_BINARY_DIR}/ws2_32_new.def) ${CMAKE_CURRENT_BINARY_DIR}/ws2_32_new.def)
set_module_type(ws2_32_new win32dll) set_module_type(ws2_32_new win32dll)
target_link_libraries(ws2_32_new ${PSEH_LIB})
add_importlibs(ws2_32_new user32 advapi32 dnsapi ws2help msvcrt kernel32 ntdll) add_importlibs(ws2_32_new user32 advapi32 dnsapi ws2help msvcrt kernel32 ntdll)
add_pch(ws2_32_new inc/ws2_32.h SOURCE) add_pch(ws2_32_new inc/ws2_32.h SOURCE)
target_link_libraries(ws2_32_new wine)
add_cd_file(TARGET ws2_32_new DESTINATION reactos/system32 FOR all) add_cd_file(TARGET ws2_32_new DESTINATION reactos/system32 FOR all)

View file

@ -28,6 +28,7 @@
#include <winuser.h> #include <winuser.h>
#include <ws2spi.h> #include <ws2spi.h>
#include <ndk/rtlfuncs.h> #include <ndk/rtlfuncs.h>
#include <pseh/pseh2.h>
/* Winsock Helper Header */ /* Winsock Helper Header */
#include <ws2help.h> #include <ws2help.h>

View file

@ -272,17 +272,29 @@ getsockopt(IN SOCKET s,
if ((level == SOL_SOCKET) && (optname == SO_OPENTYPE)) if ((level == SOL_SOCKET) && (optname == SO_OPENTYPE))
{ {
/* Validate size */ /* Validate size */
if (!(optlen) || (*optlen < sizeof(INT))) Status = ERROR_SUCCESS;
_SEH2_TRY
{ {
/* Fail */ if (!(optlen) || (*optlen < sizeof(INT)))
SetLastError(WSAEFAULT); {
return SOCKET_ERROR; /* Fail */
} Status = SOCKET_ERROR;
SetLastError(WSAEFAULT);
_SEH2_LEAVE;
}
/* Set the open type */ /* Set the open type */
*optval = (CHAR)Thread->OpenType; *optval = (CHAR)Thread->OpenType;
*optlen = sizeof(INT); *optlen = sizeof(INT);
return ERROR_SUCCESS; }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = SOCKET_ERROR;
SetLastError(WSAEFAULT);
}
_SEH2_END;
return Status;
} }
/* Get the Socket Context */ /* Get the Socket Context */
@ -292,27 +304,42 @@ getsockopt(IN SOCKET s,
if ((level == SOL_SOCKET) && (optname == SO_PROTOCOL_INFOA)) if ((level == SOL_SOCKET) && (optname == SO_PROTOCOL_INFOA))
{ {
/* Validate size and pointers */ /* Validate size and pointers */
if(!(optval) || ErrorCode = NO_ERROR;
!(optlen) || _SEH2_TRY
(*optlen < sizeof(WSAPROTOCOL_INFOA)))
{ {
/* Set return size */ if (!(optval) ||
*optlen = sizeof(WSAPROTOCOL_INFOA); !(optlen) ||
(*optlen < sizeof(WSAPROTOCOL_INFOA)))
{
/* Set return size and error code */
*optlen = sizeof(WSAPROTOCOL_INFOA);
ErrorCode = WSAEFAULT;
_SEH2_LEAVE;
}
/* It worked. Save the values */
OldOptLen = *optlen;
OldOptVal = optval;
/* Hack them so WSP will know how to deal with it */
*optlen = sizeof(WSAPROTOCOL_INFOW);
optval = (PCHAR)&ProtocolInfo;
optname = SO_PROTOCOL_INFOW;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
ErrorCode = WSAEFAULT;
}
_SEH2_END;
/* Did we encounter invalid parameters? */
if (ErrorCode != NO_ERROR)
{
/* Dereference the socket and fail */ /* Dereference the socket and fail */
WsSockDereference(Socket); WsSockDereference(Socket);
SetLastError(WSAEFAULT); SetLastError(ErrorCode);
return SOCKET_ERROR; return SOCKET_ERROR;
} }
/* It worked. Save the values */
OldOptLen = *optlen;
OldOptVal = optval;
/* Hack them so WSP will know how to deal with it */
*optlen = sizeof(WSAPROTOCOL_INFOW);
optval = (PCHAR)&ProtocolInfo;
optname = SO_PROTOCOL_INFOW;
} }
/* Make the call */ /* Make the call */
@ -338,7 +365,15 @@ getsockopt(IN SOCKET s,
OldOptVal); OldOptVal);
/* Return the length */ /* Return the length */
*optlen = OldOptLen; _SEH2_TRY
{
*optlen = OldOptLen;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
ErrorCode = WSAEFAULT;
}
_SEH2_END;
/* Return success if this worked */ /* Return success if this worked */
if (ErrorCode == ERROR_SUCCESS) return Status; if (ErrorCode == ERROR_SUCCESS) return Status;
@ -392,8 +427,19 @@ setsockopt(IN SOCKET s,
} }
/* Set the open type */ /* Set the open type */
Thread->OpenType = *optval; Status = ERROR_SUCCESS;
return ERROR_SUCCESS; _SEH2_TRY
{
Thread->OpenType = *optval;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = SOCKET_ERROR;
SetLastError(WSAEFAULT);
}
_SEH2_END;
return Status;
} }
/* Get the Socket Context */ /* Get the Socket Context */