- Implement SO_LINGER and SO_DONTLINGER for getsockopt and setsockopt
- Fix and add buffer size checks
- Yes, we've gone this long without SO_LINGER support

svn path=/trunk/; revision=53174
This commit is contained in:
Cameron Gutman 2011-08-11 07:08:16 +00:00
parent 5ea7b9c764
commit 248fe419e0

View file

@ -2034,7 +2034,7 @@ WSPGetSockOpt(IN SOCKET Handle,
PSOCKET_INFORMATION Socket = NULL;
PVOID Buffer;
INT BufferSize;
BOOLEAN BoolBuffer;
BOOL BoolBuffer;
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
@ -2069,29 +2069,38 @@ WSPGetSockOpt(IN SOCKET Handle,
case SO_ACCEPTCONN:
BoolBuffer = Socket->SharedData.Listening;
Buffer = &BoolBuffer;
BufferSize = sizeof(BOOLEAN);
BufferSize = sizeof(BOOL);
break;
case SO_BROADCAST:
BoolBuffer = Socket->SharedData.Broadcast;
Buffer = &BoolBuffer;
BufferSize = sizeof(BOOLEAN);
BufferSize = sizeof(BOOL);
break;
case SO_DEBUG:
BoolBuffer = Socket->SharedData.Debug;
Buffer = &BoolBuffer;
BufferSize = sizeof(BOOLEAN);
BufferSize = sizeof(BOOL);
break;
case SO_DONTLINGER:
BoolBuffer = (Socket->SharedData.LingerData.l_onoff == 0);
Buffer = &BoolBuffer;
BufferSize = sizeof(BOOL);
break;
case SO_LINGER:
Buffer = &Socket->SharedData.LingerData;
BufferSize = sizeof(struct linger);
break;
/* case SO_CONDITIONAL_ACCEPT: */
case SO_DONTLINGER:
case SO_DONTROUTE:
case SO_ERROR:
case SO_GROUP_ID:
case SO_GROUP_PRIORITY:
case SO_KEEPALIVE:
case SO_LINGER:
case SO_MAX_MSG_SIZE:
case SO_OOBINLINE:
case SO_PROTOCOL_INFO:
@ -2155,8 +2164,36 @@ WSPSetSockOpt(
switch (optname)
{
case SO_BROADCAST:
if (optlen < sizeof(BOOL))
{
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
Socket->SharedData.Broadcast = (*optval != 0) ? 1 : 0;
return 0;
case SO_DONTLINGER:
if (optlen < sizeof(BOOL))
{
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
Socket->SharedData.LingerData.l_onoff = (*optval != 0) ? 0 : 1;
return 0;
case SO_LINGER:
if (optlen < sizeof(struct linger))
{
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
RtlCopyMemory(&Socket->SharedData.LingerData,
optval,
sizeof(struct linger));
return 0;
default:
break;
}
}