[ros-diffs] [cgutman] 53174: [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

cgutman at svn.reactos.org cgutman at svn.reactos.org
Thu Aug 11 07:08:17 UTC 2011


Author: cgutman
Date: Thu Aug 11 07:08:16 2011
New Revision: 53174

URL: http://svn.reactos.org/svn/reactos?rev=53174&view=rev
Log:
[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

Modified:
    trunk/reactos/dll/win32/msafd/misc/dllmain.c

Modified: trunk/reactos/dll/win32/msafd/misc/dllmain.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msafd/misc/dllmain.c?rev=53174&r1=53173&r2=53174&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msafd/misc/dllmain.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msafd/misc/dllmain.c [iso-8859-1] Thu Aug 11 07:08:16 2011
@@ -2034,7 +2034,7 @@
     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 @@
                 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 @@
         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;
         }
     }
 




More information about the Ros-diffs mailing list