ruby-changes:21530
From: akr <ko1@a...>
Date: Mon, 31 Oct 2011 12:07:40 +0900 (JST)
Subject: [ruby-changes:21530] akr:r33579 (trunk): * io.c (rb_cloexec_dup2): check oldfd == newfd at first.
akr 2011-10-31 12:07:26 +0900 (Mon, 31 Oct 2011) New Revision: 33579 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33579 Log: * io.c (rb_cloexec_dup2): check oldfd == newfd at first. pointed by KOSAKI Motohiro. [ruby-dev:44713] Modified files: trunk/ChangeLog trunk/io.c Index: ChangeLog =================================================================== --- ChangeLog (revision 33578) +++ ChangeLog (revision 33579) @@ -1,3 +1,8 @@ +Mon Oct 31 12:05:24 2011 Tanaka Akira <akr@f...> + + * io.c (rb_cloexec_dup2): check oldfd == newfd at first. + pointed by KOSAKI Motohiro. [ruby-dev:44713] + Mon Oct 31 10:50:26 2011 NAKAMURA Usaku <usa@r...> * io.c (rb_cloexec_fcntl_dupfd): this function needs F_DUPFD. Index: io.c =================================================================== --- io.c (revision 33578) +++ io.c (revision 33579) @@ -239,25 +239,32 @@ { int ret; + /* When oldfd == newfd, dup2 succeeds but dup3 fails with EINVAL. + * rb_cloexec_dup2 succeeds as dup2. */ + if (oldfd == newfd) { + ret = newfd; + } + else { #if defined(HAVE_DUP3) && defined(O_CLOEXEC) - static int try_dup3 = 1; - if (2 < newfd && try_dup3) { - ret = dup3(oldfd, newfd, O_CLOEXEC); - if (ret != -1) - return ret; - /* dup3 is available since Linux 2.6.27. */ - if (errno == ENOSYS) { - try_dup3 = 0; + static int try_dup3 = 1; + if (2 < newfd && try_dup3) { + ret = dup3(oldfd, newfd, O_CLOEXEC); + if (ret != -1) + return ret; + /* dup3 is available since Linux 2.6.27. */ + if (errno == ENOSYS) { + try_dup3 = 0; + ret = dup2(oldfd, newfd); + } + } + else { ret = dup2(oldfd, newfd); } - } - else { +#else ret = dup2(oldfd, newfd); +#endif + if (ret == -1) return -1; } -#else - ret = dup2(oldfd, newfd); -#endif - if (ret == -1) return -1; fd_set_cloexec(ret); return ret; } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/