Fixed some bugs in my recently submitted patch series.

diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c
index f8ba6c1..072b281 100644
--- a/dlls/winsock/socket.c
+++ b/dlls/winsock/socket.c
@@ -2487,7 +2487,7 @@
         goto error;
     }
 
-    iovec = WS_ALLOC ( dwBufferCount * sizeof (struct iovec) );
+    iovec = HeapAlloc (GetProcessHeap(), 0, dwBufferCount * sizeof (struct iovec) );
 
     if ( !iovec )
     {
diff --git a/files/file.c b/files/file.c
index 65b264c..ef6dc52 100644
--- a/files/file.c
+++ b/files/file.c
@@ -1562,11 +1562,6 @@
         WARN ( "Couldn't get FD\n" );
         return FALSE;
     }
-    if ( ! (flags & FD_FLAG_OVERLAPPED) ) {
-        WARN ( "fd is not overlapped\n" );
-        SetLastError ( ERROR_INVALID_PARAMETER );
-        goto error;
-    }
 
     ovp = (async_fileio*) HeapAlloc(GetProcessHeap(), 0, sizeof (async_fileio));
     if(!ovp)
@@ -1790,11 +1785,6 @@
         TRACE( "Couldn't get FD\n" );
         return FALSE;
     }
-    if ( ! (flags & FD_FLAG_OVERLAPPED) ) {
-        WARN ( "fd is not overlapped\n" );
-        SetLastError ( ERROR_INVALID_PARAMETER );
-        goto error;
-    }
 
     ovp = (async_fileio*) HeapAlloc(GetProcessHeap(), 0, sizeof (async_fileio));
     if(!ovp)
diff --git a/server/file.c b/server/file.c
index 6908292..cdfb580 100644
--- a/server/file.c
+++ b/server/file.c
@@ -389,6 +389,8 @@
 
     if ( status == STATUS_PENDING )
     {
+        struct pollfd pfd;
+
         if ( !async )
             async = create_async ( obj, current, ptr );
         if ( !async )
@@ -397,6 +399,15 @@
         async->status = STATUS_PENDING;
         if ( !async->q )
             async_insert( q, async );
+
+        /* Check if the new pending request can be served immediately */
+        pfd.fd = obj->fd;
+        pfd.events = file_get_poll_events ( obj );
+        pfd.revents = 0;
+        poll ( &pfd, 1, 0 );
+
+        if ( pfd.revents )
+            file_poll_event ( obj, pfd.revents );
     }
     else if ( async ) destroy_async ( async );
     else set_error ( STATUS_INVALID_PARAMETER );
diff --git a/server/serial.c b/server/serial.c
index 173c8c3..dd5f90c 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -21,6 +21,7 @@
  */
 
 #include "config.h"
+#include "wine/port.h"
 
 #include <assert.h>
 #include <fcntl.h>
@@ -282,6 +283,8 @@
 
     if ( status == STATUS_PENDING )
     {
+        struct pollfd pfd;
+
         if ( !async )
             async = create_async ( obj, current, ptr );
         if ( !async )
@@ -293,6 +296,19 @@
             async_add_timeout(async,timeout);
             async_insert(q, async);
         }
+
+        /* Check if the new pending request can be served immediately */
+        pfd.fd = obj->fd;
+        pfd.events = serial_get_poll_events ( obj );
+        pfd.revents = 0;
+        poll ( &pfd, 1, 0 );
+
+        if ( pfd.revents )
+            /* serial_poll_event() calls set_select_events() */
+            serial_poll_event ( obj, pfd.revents );
+        else
+            set_select_events ( obj, pfd.events );
+        return;
     }
     else if ( async ) destroy_async ( async );
     else set_error ( STATUS_INVALID_PARAMETER );
diff --git a/server/sock.c b/server/sock.c
index d8362af..b102a5b 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -250,7 +250,6 @@
             sock->errors[FD_CONNECT_BIT] = sock_error( sock->obj.fd );
             if (debug_level)
                 fprintf(stderr, "socket %d connection failure\n", sock->obj.fd);
-            set_select_events( &sock->obj, -1 );
         }
     } else
     if (sock->state & FD_WINE_LISTENING)
@@ -269,7 +268,6 @@
             sock->pmask |= FD_ACCEPT;
             sock->errors[FD_ACCEPT_BIT] = sock_error( sock->obj.fd );
             sock->hmask |= FD_ACCEPT;
-            set_select_events( &sock->obj, -1 );
         }
     } else
     {
@@ -335,11 +333,17 @@
             if (debug_level)
                 fprintf(stderr, "socket %d aborted by error %d, event: %x - removing from select loop\n",
                         sock->obj.fd, sock->errors[FD_CLOSE_BIT], event);
-            set_select_events( &sock->obj, -1 );
         }
     }
 
-    sock_reselect( sock );
+    if ( sock->pmask & FD_CLOSE || event & (POLLERR|POLLHUP) )
+    {
+        if ( debug_level )
+            fprintf ( stderr, "removing socket %d from select loop\n", sock->obj.fd );
+        set_select_events( &sock->obj, -1 );
+    }
+    else
+        sock_reselect( sock );
 
     /* wake up anyone waiting for whatever just happened */
     if ( sock->pmask & sock->mask || sock->flags & FD_FLAG_OVERLAPPED ) sock_wake_up( sock, event );