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

ruby-changes:3983

From: ko1@a...
Date: Thu, 14 Feb 2008 21:02:04 +0900 (JST)
Subject: [ruby-changes:3983] akr - Ruby:r15473 (trunk): * io.c (io_reopen): check STDIN, STDOUT and STDERR mode according to

akr	2008-02-14 21:01:50 +0900 (Thu, 14 Feb 2008)

  New Revision: 15473

  Modified files:
    trunk/ChangeLog
    trunk/bootstraptest/test_io.rb
    trunk/io.c

  Log:
    * io.c (io_reopen): check STDIN, STDOUT and STDERR mode according to
      stdio streams.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bootstraptest/test_io.rb?r1=15473&r2=15472&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15473&r2=15472&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=15473&r2=15472&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15472)
+++ ChangeLog	(revision 15473)
@@ -1,3 +1,8 @@
+Thu Feb 14 21:00:14 2008  Tanaka Akira  <akr@f...>
+
+	* io.c (io_reopen): check STDIN, STDOUT and STDERR mode according to
+	  stdio streams.
+
 Thu Feb 14 16:07:40 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* test/ruby/test_math.rb: actual-expected argument ordering for
Index: bootstraptest/test_io.rb
===================================================================
--- bootstraptest/test_io.rb	(revision 15472)
+++ bootstraptest/test_io.rb	(revision 15473)
@@ -52,3 +52,20 @@
   File.unlink(tmpname)
   :ok
 }
+
+assert_equal 'ok', %q{
+  require 'tmpdir'
+  begin
+    tmpname = "#{Dir.tmpdir}/ruby-btest-#{$$}-#{rand(0x100000000).to_s(36)}"
+    rw = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL)
+  rescue Errno::EEXIST
+    retry
+  end
+  save = STDIN.dup
+  STDIN.reopen(rw)
+  STDIN.print "a"
+  STDIN.reopen(save)
+  rw.close
+  File.unlink(tmpname)
+  :ok
+}
Index: io.c
===================================================================
--- io.c	(revision 15472)
+++ io.c	(revision 15473)
@@ -4112,8 +4112,9 @@
     if (fptr == orig) return io;
 #if !defined __CYGWIN__
     if (IS_PREP_STDIO(fptr)) {
-	if (((fptr->mode & FMODE_READWRITE) & (orig->mode & FMODE_READWRITE)) !=
-            (fptr->mode & FMODE_READWRITE)) {
+        if ((fptr->stdio_file == stdin && !(orig->mode & FMODE_READABLE)) ||
+            (fptr->stdio_file == stdout && !(orig->mode & FMODE_WRITABLE)) ||
+            (fptr->stdio_file == stderr && !(orig->mode & FMODE_WRITABLE))) {
 	    rb_raise(rb_eArgError,
 		     "%s can't change access mode from \"%s\" to \"%s\"",
 		     PREP_STDIO_NAME(fptr), rb_io_flags_mode(fptr->mode),
@@ -4132,13 +4133,7 @@
     }
 
     /* copy rb_io_t structure */
-    if (fptr->mode & FMODE_PREP) {
-        int mask = FMODE_PREP|FMODE_READWRITE;
-        fptr->mode = (orig->mode & ~mask)|(fptr->mode & mask);
-    }
-    else {
-        fptr->mode = orig->mode;
-    }
+    fptr->mode = orig->mode | (fptr->mode & FMODE_PREP);
     fptr->pid = orig->pid;
     fptr->lineno = orig->lineno;
     if (fptr->path) free(fptr->path);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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