Return-Path: Received: from pch.mit.edu (PCH.MIT.EDU [18.7.21.90]) by krbdev.mit.edu (Postfix) with ESMTP id 6591B3E67B; Fri, 22 Jul 2011 15:38:00 -0400 (EDT) Received: from pch.mit.edu (pch.mit.edu [127.0.0.1]) by pch.mit.edu (8.13.6/8.12.8) with ESMTP id p6MJc0mf008369; Fri, 22 Jul 2011 15:38:00 -0400 Received: from mailhub-dmz-3.mit.edu (MAILHUB-DMZ-3.MIT.EDU [18.9.21.42]) by pch.mit.edu (8.13.6/8.12.8) with ESMTP id p6LMJ9Mj024694 for ; Thu, 21 Jul 2011 18:19:09 -0400 Received: from dmz-mailsec-scanner-2.mit.edu (DMZ-MAILSEC-SCANNER-2.MIT.EDU [18.9.25.13]) by mailhub-dmz-3.mit.edu (8.13.8/8.9.2) with ESMTP id p6LMJ984030654 for ; Thu, 21 Jul 2011 18:19:09 -0400 X-Auditid: 1209190d-b7be0ae000000a16-6c-4e28a541bd17 Authentication-Results: symauth.service.identifier Received: from hub025-nj-4.exch025.serverdata.net (hub025-nj-4.exch025.serverdata.net [206.225.166.87]) by dmz-mailsec-scanner-2.mit.edu (Symantec Messaging Gateway) with SMTP id DE.AC.02582.145A82E4; Thu, 21 Jul 2011 18:16:34 -0400 (EDT) Received: from MBX025-E1-NJ-4.exch025.domain.local ([10.240.12.54]) by HUB025-NJ-4.exch025.domain.local ([10.240.12.39]) with mapi id 14.01.0289.001; Thu, 21 Jul 2011 15:19:08 -0700 From: Arlene Berry To: "krb5-bugs@mit.edu" Subject: blocking recv caused our server to hang Thread-Topic: blocking recv caused our server to hang Thread-Index: AcxH9Do3LdwtoXlLTDa653CHbfOjBA== Date: Thu, 21 Jul 2011 22:19:08 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-Tnef-Correlator: X-Originating-Ip: [74.202.214.86] Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrGKsWRWlGSWpSXmKPExsVy7uGycF2npRp+BtMX8Vk0PDzO7sDo0XTm KHMAYxSXTUpqTmZZapG+XQJXxqu7mgVtfBU7j5xhbWBs5e5i5OSQEDCR2HH4BCOIzShgJLH7 3CtWiLiYxIV769m6GLk4hAQ+MErc2rYAytnJKPFw9S42kCo2AQ2JW7fWsYDYIgLaEktmPAGK c3AICxhIdC+QhwibSnw4u58VwtaTmDZ7FVgri4CqROuhy2A2r0CURFfPZRaII8Qkvp9awwRi MwuIS9x6Mp8J4iABiSV7zjND2KISLx//gzpUUaKpcT9UvY7Egt2f2CBsbYllC18zQ8wXlDg5 8wnLBEaRWUjGzkLSMgtJyywkLQsYWVYxyqbkVunmJmbmFKcm6xYnJ+blpRbpGunlZpbopaaU bmIERoIQpyTvDsZ3B5UOMQpwMCrx8Eb7a/gJsSaWFVfmHmKU5GBSEuV9uhgoxJeUn1KZkVic EV9UmpNafIhRgoNZSYRXKAYox5uSWFmVWpQPk5LmYFES51Xz/u8rJJCeWJKanZpakFoEk2Xi YD/EKMPBoSTB+34JULdgUWp6akVaZk4JshpOEMEFsoYHaI33UpA1xQWJucWZ6RBFpxgVpcR5 xUESAiCJjNI8uAGg5FX/////S4yyUsK8jAwMDEI8QBcAPY6QByW/V4ziQE8L83qATOHJzCuB m/4KaDET0OIWdVWQxSWJCCmpBsa2xskP3eNz1OuzJVOfhQg9C5gupr5aOHruqydXVJ35e+5G egmzLbjdt/D3rK/RwQbSdc+e/uJME+TrWH9xr2v9W+8FjBXmXLpHzEKMYydNLX97tfLHj0rm j/dFn71P/xPOFfX9EfPlF18Y/Ivnm9wvlQj4vf24j231v/KdAbXxSjdEJ2h6KyqxFGckGmox FxUnAgCcOStfWQMAAA== Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by pch.mit.edu id p6LMJ9Mj024694 X-Mailman-Approved-At: Fri, 22 Jul 2011 15:37:59 -0400 X-Beenthere: krb5-bugs-incoming@mailman.mit.edu X-Mailman-Version: 2.1.6 Precedence: list Sender: krb5-bugs-incoming-bounces@PCH.mit.edu Errors-To: krb5-bugs-incoming-bounces@PCH.mit.edu X-RT-Original-Encoding: us-ascii Content-Length: 1587 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); }