[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 */
Status = ERROR_SUCCESS;
_SEH2_TRY
{
if (!(optlen) || (*optlen < sizeof(INT))) if (!(optlen) || (*optlen < sizeof(INT)))
{ {
/* Fail */ /* Fail */
Status = SOCKET_ERROR;
SetLastError(WSAEFAULT); SetLastError(WSAEFAULT);
return SOCKET_ERROR; _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,17 +304,17 @@ 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 */
ErrorCode = NO_ERROR;
_SEH2_TRY
{
if (!(optval) || if (!(optval) ||
!(optlen) || !(optlen) ||
(*optlen < sizeof(WSAPROTOCOL_INFOA))) (*optlen < sizeof(WSAPROTOCOL_INFOA)))
{ {
/* Set return size */ /* Set return size and error code */
*optlen = sizeof(WSAPROTOCOL_INFOA); *optlen = sizeof(WSAPROTOCOL_INFOA);
ErrorCode = WSAEFAULT;
/* Dereference the socket and fail */ _SEH2_LEAVE;
WsSockDereference(Socket);
SetLastError(WSAEFAULT);
return SOCKET_ERROR;
} }
/* It worked. Save the values */ /* It worked. Save the values */
@ -314,6 +326,21 @@ getsockopt(IN SOCKET s,
optval = (PCHAR)&ProtocolInfo; optval = (PCHAR)&ProtocolInfo;
optname = SO_PROTOCOL_INFOW; 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 */
WsSockDereference(Socket);
SetLastError(ErrorCode);
return SOCKET_ERROR;
}
}
/* Make the call */ /* Make the call */
Status = Socket->Provider->Service.lpWSPGetSockOpt(s, Status = Socket->Provider->Service.lpWSPGetSockOpt(s,
@ -338,7 +365,15 @@ getsockopt(IN SOCKET s,
OldOptVal); OldOptVal);
/* Return the length */ /* Return the length */
_SEH2_TRY
{
*optlen = OldOptLen; *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 */
Status = ERROR_SUCCESS;
_SEH2_TRY
{
Thread->OpenType = *optval; Thread->OpenType = *optval;
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 */