In rare circumstances, such as checksum errors, some network stacks
authorGreg Hudson <ghudson@mit.edu>
Mon, 25 Jul 2011 16:00:06 +0000 (16:00 +0000)
committerGreg Hudson <ghudson@mit.edu>
Mon, 25 Jul 2011 16:00:06 +0000 (16:00 +0000)
can flag an fd for reading in select() and still block when the fd is
read.  Set all sockets non-blocking to prevent hangs when this occurs.
(We don't actually handle the resulting EWOULDBLOCK or EAGAIN errors,
so the rare cases will appear as communication failures and we will
close the socket.  This is already the case for TCP sockets and
probably isn't a big deal.)

ticket: 6933

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25048 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/krb5/os/sendto_kdc.c

index 371af9d23f0eaafe6c1805c6358d3760983fc4a5..5415987876d329f2fad29bfc4f2bcfe52766ba6d 100644 (file)
@@ -758,6 +758,8 @@ start_connection(krb5_context context, struct conn_state *state,
 {
     int fd, e;
     unsigned int ssflags;
+    static const int one = 1;
+    static const struct linger lopt = { 0, 0 };
 
     dprint("start_connection(@%p)\ngetting %s socket in family %d...", state,
            state->socktype == SOCK_STREAM ? "stream" : "dgram", state->family);
@@ -769,12 +771,9 @@ start_connection(krb5_context context, struct conn_state *state,
     }
     set_cloexec_fd(fd);
     /* Make it non-blocking.  */
+    if (ioctlsocket(fd, FIONBIO, (const void *) &one))
+        dperror("sendto_kdc: ioctl(FIONBIO)");
     if (state->socktype == SOCK_STREAM) {
-        static const int one = 1;
-        static const struct linger lopt = { 0, 0 };
-
-        if (ioctlsocket(fd, FIONBIO, (const void *) &one))
-            dperror("sendto_kdc: ioctl(FIONBIO)");
         if (setsockopt(fd, SOL_SOCKET, SO_LINGER, &lopt, sizeof(lopt)))
             dperror("sendto_kdc: setsockopt(SO_LINGER)");
         TRACE_SENDTO_KDC_TCP_CONNECT(context, state);