[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]