From 139d06c34f4d51147a5d7707e738878b1fda65bf Mon Sep 17 00:00:00 2001 From: shugo Date: Fri, 21 Feb 2014 14:59:44 +0000 Subject: * ext/socket/init.c (wait_connectable): break if the socket is writable to avoid infinite loops on FreeBSD and other platforms which conforms to SUSv3. This problem cannot be reproduced with loopback interfaces, so it's hard to write test code. rsock_connect() and wait_connectable() are overly complicated, so they should be refactored, but I commit this fix as a workaround for the release of Ruby 1.9.3 scheduled on Feb 24. [ruby-core:60940] [Bug #9547] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/socket/init.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'ext/socket') diff --git a/ext/socket/init.c b/ext/socket/init.c index dc6b531bd6..f6cd2bce7b 100644 --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -364,8 +364,12 @@ wait_connectable(int fd) */ if (ret < 0) break; - if (sockerr == 0) - continue; /* workaround for winsock */ + if (sockerr == 0) { + if (revents & RB_WAITFD_OUT) + break; + else + continue; /* workaround for winsock */ + } /* BSD and Linux use sockerr. */ errno = sockerr; -- cgit v1.2.3