[ros-diffs] [arty] 23638: - Fixed timeout calculation. - Fixed a couple of leaks.

arty at svn.reactos.org arty at svn.reactos.org
Mon Aug 21 05:59:03 CEST 2006


Author: arty
Date: Mon Aug 21 07:59:02 2006
New Revision: 23638

URL: http://svn.reactos.org/svn/reactos?rev=23638&view=rev
Log:
- Fixed timeout calculation.
- Fixed a couple of leaks.

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=23638&r1=23637&r2=23638&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msafd/misc/dllmain.c (original)
+++ trunk/reactos/dll/win32/msafd/misc/dllmain.c Mon Aug 21 07:59:02 2006
@@ -597,11 +597,7 @@
     ULONG				i, j = 0, x;
     HANDLE                              SockEvent;
     BOOL                                HandleCounted;
-    
-    Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
-			    NULL, 1, FALSE );
-    
-    if( !NT_SUCCESS(Status) ) return SOCKET_ERROR;
+    LARGE_INTEGER                       Timeout;
     
     /* Find out how many sockets we have, and how large the buffer needs 
      * to be */
@@ -613,30 +609,54 @@
 
     if( HandleCount < 0 || nfds != 0 ) HandleCount = nfds * 3;
 
-    PollBufferSize = sizeof(*PollInfo) + 
-	(HandleCount * sizeof(AFD_HANDLE));
+    PollBufferSize = sizeof(*PollInfo) + (HandleCount * sizeof(AFD_HANDLE));
     
     AFD_DbgPrint(MID_TRACE,("HandleCount: %d BufferSize: %d\n", 
                             HandleCount, PollBufferSize));
 
+    /* Convert Timeout to NT Format */
+    if (timeout == NULL) {
+	Timeout.u.LowPart = -1;
+	Timeout.u.HighPart = 0x7FFFFFFF;
+	AFD_DbgPrint(MAX_TRACE,("Infinite timeout\n"));
+    } else {
+	Timeout = RtlEnlargedIntegerMultiply
+	    ((timeout->tv_sec * 1000) + (timeout->tv_usec / 1000), -10000);
+	/* Negative timeouts are illegal.  Since the kernel represents an 
+	 * incremental timeout as a negative number, we check for a positive
+	 * result.
+	 */
+	if (Timeout.QuadPart > 0) {
+	  if (lpErrno) *lpErrno = WSAEINVAL;
+	  return SOCKET_ERROR;
+	}
+	AFD_DbgPrint(MAX_TRACE,("Timeout: Orig %d.%06d kernel %d\n",
+				timeout->tv_sec, timeout->tv_usec,
+				Timeout.u.LowPart));
+    }
+    
+    Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
+			    NULL, 1, FALSE );
+    
+    if( !NT_SUCCESS(Status) ) return SOCKET_ERROR;
+    
     /* Allocate */
     PollBuffer = HeapAlloc(GlobalHeap, 0, PollBufferSize);
+
+    if (!PollBuffer) {
+      if (*lpErrno) *lpErrno = WSAEFAULT;
+      NtClose(SockEvent);
+      return SOCKET_ERROR;
+    }
+
     PollInfo = (PAFD_POLL_INFO)PollBuffer;
-    
+
     RtlZeroMemory( PollInfo, PollBufferSize );
 
-    /* Convert Timeout to NT Format */
-    if (timeout == NULL) {
-	PollInfo->Timeout.u.LowPart = -1;
-	PollInfo->Timeout.u.HighPart = 0x7FFFFFFF;
-    } else {
-	PollInfo->Timeout = RtlEnlargedIntegerMultiply
-	    ((timeout->tv_sec * 1000) + timeout->tv_usec, -10000);
-    }
-    
     /* Number of handles for AFD to Check */
     PollInfo->HandleCount = HandleCount;
     PollInfo->Exclusive = FALSE;
+    PollInfo->Timeout = Timeout;
     
     if (readfds != NULL) {
 	for (i = 0; i < readfds->fd_count; i++, j++) {
@@ -734,6 +754,7 @@
 	}
     }
 
+    HeapFree( GlobalHeap, 0, PollBuffer );
     NtClose( SockEvent );
 
     AFD_DbgPrint(MID_TRACE,("lpErrno = %x\n", lpErrno));




More information about the Ros-diffs mailing list