[#25035] 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...>

こんにちは。

16 messages 2004/12/03
[#25070] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — nobu@... 2004/12/06

なかだです。

[#25071] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...> 2004/12/06

In message <200412060607.iB667giF007533@sharui.nakada.niregi.kanuma.tochigi.jp>

[#25089] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — nobu@... 2004/12/07

なかだです。

[#25090] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...> 2004/12/07

In message <200412070015.iB70FAiF012770@sharui.nakada.niregi.kanuma.tochigi.jp>

[#25093] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — akira yamada / やまだあきら <akira@...> 2004/12/07

2004-12-07 (火) の 12:27 +0900 に Takahiro Kambe さんは書きました:

[#25041] temporal locking already locked string on simultaneous write — Tanaka Akira <akr@...17n.org>

同じ文字列をほぼ同時に IO に書き込むと、temporal locking already

13 messages 2004/12/04
[#25042] Re: temporal locking already locked string on simultaneous write — Yukihiro Matsumoto <matz@...> 2004/12/04

まつもと ゆきひろです

[#25043] Re: temporal locking already locked string on simultaneous write — Tanaka Akira <akr@...17n.org> 2004/12/04

In article <1102133507.339625.10453.nullmailer@x31.priv.netlab.jp>,

[#25096] double free problem — "Akinori MUSHA" <knu@...>

 ご無沙汰しております。

15 messages 2004/12/07
[#25099] Re: double free problem — Yukihiro Matsumoto <matz@...> 2004/12/07

Hi,

[#25101] non-stdio buffering — Tanaka Akira <akr@...17n.org>

えぇと、今回 1.9 でなにが起きたのかを私が把握している範囲でまとめてお

18 messages 2004/12/07

[#25152] 1.8 reopen problem with duplex popen — Tanaka Akira <akr@...17n.org>

次のように、1.8 で双方向 popen な IO を reopen するとエラーになること

11 messages 2004/12/10

[#25158] core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org>

NetBSD 2.0 で次のようにすると core を吐きます。

18 messages 2004/12/11
[#25159] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/11

In article <87hdmsivva.fsf@serein.a02.aist.go.jp>,

[#25163] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/12

In article <87ekhwiv7g.fsf@serein.a02.aist.go.jp>,

[#25165] Re: core dump on NetBSD 2.0 — nobu@... 2004/12/13

なかだです。

[#25167] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/13

In article <200412130040.iBD0e8Qh003275@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#25193] 1.8.2 release schedule — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

15 messages 2004/12/14

[#25299] Re: リリース準備 — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

20 messages 2004/12/24
[#25301] Re: リリース準備 — TAKAHASHI Masayoshi <maki@...> 2004/12/24

高橋征義です。

[#25302] test_readline.rb blocks on BSD again — GOTOU Yuuzou <gotoyuzo@...>

In message <20041223175402.3116FC6718@lithium.ruby-lang.org>,

15 messages 2004/12/24
[#25314] Re: test_readline.rb blocks on BSD again — GOTOU Yuuzou <gotoyuzo@...> 2004/12/24

In message <20041224.131211.846943951.gotoyuzo@sawara.does.notwork.org>,

[#25315] Re: test_readline.rb blocks on BSD again — Yukihiro Matsumoto <matz@...> 2004/12/24

まつもと ゆきひろです

[#25317] Re: test_readline.rb blocks on BSD again — WATANABE Hirofumi <eban@...> 2004/12/25

わたなべです。

[ruby-dev:25225] STDIN.reopen(STDOUT).reopen(STDOUT)

From: nobu@...
Date: 2004-12-16 14:52:14 UTC
List: ruby-dev #25225
なかだです。

http://diary.does.notwork.org/gotoyuzo/?date=20041122#p02
| NetBSDでは、STDIN限定で上のようなコードが失敗するようだ。
| 
|     * 1回目のreopenでSTDINがFMODE_WRITABLEに変わる。
|     * 2回目のreopenでFMODE_WRITABLEなのでfflush(stdin)が呼ばれる。
|     * しかし、FILE*が以前のモードを憶えたままなのでfflushでエラー。 

という件ですが、STDINなどは特別扱いにして、modeの変更を禁止して
しまってはどうでしょうか。


* io.c (io_reopen, rb_io_reopen): prohibit to change access mode for
  special IO ports.


Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.351
diff -U2 -p -d -r1.351 io.c
--- io.c	9 Dec 2004 03:34:47 -0000	1.351
+++ io.c	16 Dec 2004 06:24:03 -0000
@@ -1917,4 +1917,8 @@ rb_io_isatty(io)
 }
 
+#define FMODE_PREP (1<<16)
+#define IS_PREP_STDIO(f) ((f)->mode & FMODE_PREP)
+#define PREP_STDIO_NAME(f) ((f)->path)
+
 static void
 fptr_finalize(fptr, noraise)
@@ -1925,7 +1929,5 @@ fptr_finalize(fptr, noraise)
         io_fflush(fptr);
     }
-    if (fptr->stdio_file == stdin ||
-        fptr->stdio_file == stdout ||
-        fptr->stdio_file == stderr ||
+    if (IS_PREP_STDIO(fptr) ||
         fptr->fd <= 2) {
 	return;
@@ -3272,4 +3274,14 @@ io_reopen(io, nfile)
 
     if (fptr == orig) return io;
+#if !defined __CYGWIN__
+    if (IS_PREP_STDIO(fptr)) {
+	if ((fptr->mode & FMODE_READWRITE) != (orig->mode & FMODE_READWRITE)) {
+	    rb_raise(rb_eArgError,
+		     "%s cannot change access mode from \"%s\" to \"%s\"",
+		     PREP_STDIO_NAME(fptr), rb_io_flags_mode(fptr->mode),
+		     rb_io_flags_mode(orig->mode));
+	}
+    }
+#endif
     if (orig->mode & FMODE_READABLE) {
 	pos = io_tell(orig);
@@ -3295,7 +3307,5 @@ io_reopen(io, nfile)
     if (fd != fd2) {
 #if !defined __CYGWIN__
-	if (fptr->stdio_file == stdin ||
-            fptr->stdio_file == stdout ||
-            fptr->stdio_file == stderr) {
+	if (IS_PREP_STDIO(fptr)) {
 	    /* need to keep stdio objects */
 	    if (dup2(fd2, fd) < 0)
@@ -3378,5 +3388,13 @@ rb_io_reopen(argc, argv, file)
 
     if (!NIL_P(nmode)) {
-	fptr->mode = rb_io_mode_flags(StringValuePtr(nmode));
+	int flags = rb_io_mode_flags(StringValuePtr(nmode));
+	if (IS_PREP_STDIO(fptr) &&
+	    (fptr->mode & FMODE_READWRITE) != (flags & FMODE_READWRITE)) {
+	    rb_raise(rb_eArgError,
+		     "%s cannot change access mode from \"%s\" to \"%s\"",
+		     PREP_STDIO_NAME(fptr), rb_io_flags_mode(fptr->mode),
+		     rb_io_flags_mode(flags));
+	}
+	fptr->mode = flags;
     }
 
@@ -3858,8 +3876,9 @@ deferr_setter(val, id, variable)
 
 static VALUE
-prep_stdio(f, mode, klass)
+prep_stdio(f, mode, klass, path)
     FILE *f;
     int mode;
     VALUE klass;
+    const char *path;
 {
     OpenFile *fp;
@@ -3875,5 +3894,5 @@ prep_stdio(f, mode, klass)
 #endif
     fp->stdio_file = f;
-    fp->mode = mode;
+    fp->mode = mode | FMODE_PREP;
     if (fp->mode & FMODE_WRITABLE) {
         if (fp->fd == 2) { /* stderr must be unbuffered */
@@ -3884,20 +3903,9 @@ prep_stdio(f, mode, klass)
         }
     }
+    fp->path = strdup(path);
 
     return io;
 }
 
-static void
-prep_path(io, path)
-    VALUE io;
-    char *path;
-{
-    OpenFile *fptr;
-
-    GetOpenFile(io, fptr);
-    if (fptr->path) rb_bug("illegal prep_path() call");
-    fptr->path = strdup(path);
-}
-
 FILE *rb_io_stdio_file(OpenFile *fptr)
 {
@@ -4214,10 +4222,8 @@ next_argv()
 		    }
 #endif
-		    rb_stdout = prep_stdio(fw, FMODE_WRITABLE, rb_cFile);
-		    prep_path(rb_stdout, fn);
+		    rb_stdout = prep_stdio(fw, FMODE_WRITABLE, rb_cFile, fn);
 		    if (stdout_binmode) rb_io_binmode(rb_stdout);
 		}
-		current_file = prep_stdio(fr, FMODE_READABLE, rb_cFile);
-		prep_path(current_file, fn);
+		current_file = prep_stdio(fr, FMODE_READABLE, rb_cFile, fn);
 	    }
 	    if (binmode) rb_io_binmode(current_file);
@@ -5553,9 +5559,9 @@ Init_IO()
     rb_define_method(rb_cIO, "inspect",  rb_io_inspect, 0);
 
-    rb_stdin = prep_stdio(stdin, FMODE_READABLE, rb_cIO);
+    rb_stdin = prep_stdio(stdin, FMODE_READABLE, rb_cIO, "<STDIN>");
     rb_define_variable("$stdin", &rb_stdin);
-    rb_stdout = prep_stdio(stdout, FMODE_WRITABLE, rb_cIO);
+    rb_stdout = prep_stdio(stdout, FMODE_WRITABLE, rb_cIO, "<STDOUT>");
     rb_define_hooked_variable("$stdout", &rb_stdout, 0, stdout_setter);
-    rb_stderr = prep_stdio(stderr, FMODE_WRITABLE, rb_cIO);
+    rb_stderr = prep_stdio(stderr, FMODE_WRITABLE, rb_cIO, "<STDERR>");
     rb_define_hooked_variable("$stderr", &rb_stderr, 0, stdout_setter);
     rb_define_hooked_variable("$>", &rb_stdout, 0, stdout_setter);


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next