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