From 248fe419e01ca92136ac975e7270a0520b83eda4 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 11 Aug 2011 07:08:16 +0000 Subject: [PATCH] [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 --- reactos/dll/win32/msafd/misc/dllmain.c | 49 ++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index 7ff0de28122..0ed3810fa82 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -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; } }