mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 12:29:56 +00:00
[MSAFD]
- 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:
parent
5ea7b9c764
commit
248fe419e0
1 changed files with 43 additions and 6 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue