summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-22 00:52:54 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-22 00:52:54 +0000
commitbf37857587758817f8dfa32bc18b50658c28eb2d (patch)
tree9f7823c8e749516850cbdae669194efc164a8d36
parent88a1065136877f39a1f2d5d07efafa5232082c83 (diff)
downloadruby-bf37857587758817f8dfa32bc18b50658c28eb2d.tar.gz
merge revision(s) 45084: [Backport #9547]
* 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/branches/ruby_1_9_3@45092 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog11
-rw-r--r--ext/socket/init.c8
-rw-r--r--version.h2
3 files changed, 18 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 1f699c3a35..58401693db 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Sat Feb 22 09:51:53 2014 Shugo Maeda <shugo@ruby-lang.org>
+
+ * 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]
+
Sat Feb 22 09:26:05 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* class.c (rb_mod_init_copy): do nothing if copying self.
diff --git a/ext/socket/init.c b/ext/socket/init.c
index 54452e4b99..e63fb80c74 100644
--- a/ext/socket/init.c
+++ b/ext/socket/init.c
@@ -281,8 +281,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;
diff --git a/version.h b/version.h
index 261aaad913..ad46963237 100644
--- a/version.h
+++ b/version.h
@@ -1,5 +1,5 @@
#define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 538
+#define RUBY_PATCHLEVEL 539
#define RUBY_RELEASE_DATE "2014-02-22"
#define RUBY_RELEASE_YEAR 2014