]> granicus.if.org Git - postgresql/commitdiff
Expect EWOULDBLOCK from a non-blocking connect() call only on Windows.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Jun 2013 16:36:44 +0000 (12:36 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Jun 2013 16:37:01 +0000 (12:37 -0400)
On Unix-ish platforms, EWOULDBLOCK may be the same as EAGAIN, which is
*not* a success return, at least not on Linux.  We need to treat it as a
failure to avoid giving a misleading error message.  Per the Single Unix
Spec, only EINPROGRESS and EINTR returns indicate that the connection
attempt is in progress.

On Windows, on the other hand, EWOULDBLOCK (WSAEWOULDBLOCK) is the expected
case.  We must accept EINPROGRESS as well because Cygwin will return that,
and it doesn't seem worth distinguishing Cygwin from native Windows here.
It's not very clear whether EINTR can occur on Windows, but let's leave
that part of the logic alone in the absence of concrete trouble reports.

Also, remove the test for errno == 0, effectively reverting commit
da9501bddb42222dc33c031b1db6ce2133bcee7b, which AFAICS was just a thinko;
or at best it might have been a workaround for a platform-specific bug,
which we can hope is gone now thirteen years later.  In any case, since
libpq makes no effort to reset errno to zero before calling connect(),
it seems unlikely that that test has ever reliably done anything useful.

Andres Freund and Tom Lane

src/interfaces/libpq/fe-connect.c

index 0d729c88b0c50efd4c1ba41b2a4142e808e316da..18fcb0c23724c7344f62f36adcb4f5ef9b0c73dc 100644 (file)
@@ -1780,9 +1780,10 @@ keep_going:                                              /* We will come back to here until there is
                                                                addr_cur->ai_addrlen) < 0)
                                        {
                                                if (SOCK_ERRNO == EINPROGRESS ||
+#ifdef WIN32
                                                        SOCK_ERRNO == EWOULDBLOCK ||
-                                                       SOCK_ERRNO == EINTR ||
-                                                       SOCK_ERRNO == 0)
+#endif
+                                                       SOCK_ERRNO == EINTR)
                                                {
                                                        /*
                                                         * This is fine - we're in non-blocking mode, and