[12052] in Kerberos-V5-bugs
[krbdev.mit.edu #6933] blocking recv caused our server to hang
daemon@ATHENA.MIT.EDU (Arlene Berry" via RT)
Fri Jul 22 15:38:12 2011
Mail-followup-to: rt@krbdev.mit.edu
mail-copies-to: never
From: ""Arlene Berry" via RT" <rt-comment@krbdev.MIT.EDU>
In-Reply-To: <rt-6933@krbdev.mit.edu>
Message-ID: <rt-6933-34187.10.9187822049896@krbdev.mit.edu>
To: "'AdminCc of krbdev.mit.edu Ticket #6933'":;"'AdminCc of krbdev.mit.edu Ticket #6933'":;@MIT.EDU
Date: Fri, 22 Jul 2011 15:38:01 -0400 (EDT)
Reply-To: rt-comment@krbdev.MIT.EDU
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: krb5-bugs-bounces@mit.edu
We've had this patch in our local source for a long time and the original description says select reported a socket as ready for reading but the recv blocked which caused our server to hang. This was seen on multiple versions of Solaris and possibly elsewhere. We solved it by changing all sockets to non-blocking.
Index: src/lib/krb5/os/sendto_kdc.c
===================================================================
--- src/lib/krb5/os/sendto_kdc.c (revision 25023)
+++ src/lib/krb5/os/sendto_kdc.c (working copy)
@@ -758,6 +758,8 @@
{
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,14 +771,11 @@
}
set_cloexec_fd(fd);
/* Make it non-blocking. */
+ 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)");
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);
}
_______________________________________________
krb5-bugs mailing list
krb5-bugs@mit.edu
https://mailman.mit.edu/mailman/listinfo/krb5-bugs