[#24698] NKF(nkf2)を1.8ブランチに入れました — "NARUSE, Yui" <naruse@...>

naruseです。

14 messages 2004/11/03
[#24734] Re: NKF(nkf2)を1.8ブランチに入れました — 堀川 久 <vzw00011@...> 2004/11/06

こんにちは。

[#24720] メール関係ライブラリの標準添付について — MoonWolf <moonwolf@...>

MoonWolfです。

17 messages 2004/11/05
[#24721] Re: メール関係ライブラリの標準添付について — Yukihiro Matsumoto <matz@...> 2004/11/05

まつもと ゆきひろです

[#24722] Re: メール関係ライブラリの標準添付について — MoonWolf <moonwolf@...> 2004/11/05

MoonWolfです。

[#24804] Re: まつもとさんの負担を減らすために、何ができるだろう — "URABE Shyouhei aka.mput" <root@...>

mput です。 ruby-dev に移動します。

21 messages 2004/11/13
[#24805] Re: まつもとさんの負担を減らすために、何ができるだろう — Tanaka Akira <akr@...17n.org> 2004/11/13

In article <2D6284E3-351D-11D9-B7EF-000393735AAE@mput.dip.jp>,

[#24806] Re: まつもとさんの負担を減らすために、何ができるだろう — "URABE Shyouhei aka.mput" <root@...> 2004/11/13

mput です。

[#24808] Re: まつもとさんの負担を減らすために、何ができるだろう — Masayoshi Takahashi <maki@...> 2004/11/13

高橋征義です。

[#24809] Re: まつもとさんの負担を減らすために、何ができるだろう — "URABE Shyouhei aka.mput" <root@...> 2004/11/13

mput です。

[#24834] Process.getrlimit and Process.setrlimit — Tanaka Akira <akr@...17n.org>

Process.getrlimit と Process.setrlimit が欲しいので実装してみました。

25 messages 2004/11/13

[#24965] sync and stdio buffering — Tanaka Akira <akr@...17n.org>

ちょっとした思いつきなのですが、

12 messages 2004/11/26

[#24993] rb_io_sysread dumps core [BUG] rb_sys_fail() - errno == 0 — Tietew <tietew-ml-ruby-dev@...>

ソケットとスレッドを大量に使うアプリ(具体的には IRCbot です)を

13 messages 2004/11/29

[#25003] IO#flush dumps core again — Tanaka Akira <akr@...17n.org>

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

28 messages 2004/11/30
[#25004] Re: IO#flush dumps core again — nobu@... 2004/11/30

なかだです。

[#25005] Re: IO#flush dumps core again — Yukihiro Matsumoto <matz@...> 2004/11/30

まつもと ゆきひろです

[#25009] Re: IO#flush dumps core again — Tanaka Akira <akr@...17n.org> 2004/12/01

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

[#25014] Re: IO#flush dumps core again — Tanaka Akira <akr@...17n.org> 2004/12/01

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

[#25015] Re: IO#flush dumps core again — Yukihiro Matsumoto <matz@...> 2004/12/01

まつもと ゆきひろです

[#25056] Re: IO#flush dumps core again — Tanaka Akira <akr@...17n.org> 2004/12/05

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

[#25074] Re: IO#flush dumps core again — Tanaka Akira <akr@...17n.org> 2004/12/06

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

[ruby-dev:24990] Re: IO#flush dumps core

From: nobu@...
Date: 2004-11-29 03:03:11 UTC
List: ruby-dev #24990
なかだです。

At Mon, 29 Nov 2004 10:48:20 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:24988]:
> fptr_finalize()で
> 
> 	while (n2 = 0, fclose(fptr->f2) < 0) {
> 
> というようなコード(2箇所)がありますが、man fcloseを読むと
> 
>   返り値
> 
>        関 数 が 正 常に終了すると 0 が返される。正常に終了し
>        なかった場合には EOF が返され、大域変数errno がエラー
>        を示すために設定される。どちらの場合も、そのストリー
>        ムに対する( fclose() へ のさらなる呼び出しを含む)それ
>        以上のアクセスは未定義の動作を生じさせる。
> 
> だそうですから、これはまずいことになりそうです。実際にglibc 
> のソースを見ると問答無用でFILE*構造体をfreeしてます。で、
> freeされた構造体の中をアクセスしてSEGVする、というわけです。
> ここは中田さんが手を入れたところなんで、見てくださるとありが
> たいんですが。

見落としでした。[ruby-dev:24985]をそのままテストに入れるとブロッ
クしちゃうので、こんなところでしょうか。


Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.335
diff -U2 -p -d -r1.335 io.c
--- io.c	28 Nov 2004 17:02:14 -0000	1.335
+++ io.c	29 Nov 2004 02:29:22 -0000
@@ -1945,5 +1945,5 @@ fptr_finalize(fptr, noraise)
     if (fptr->f2) {
 	f2 = fileno(fptr->f2);
-	while (n2 = 0, fclose(fptr->f2) < 0) {
+	while (n2 = 0, fflush(fptr->f2) < 0) {
 	    n2 = errno;
 	    if (!rb_io_wait_writable(f2)) {
@@ -1952,13 +1952,20 @@ fptr_finalize(fptr, noraise)
 	    if (!fptr->f2) break;
 	}
+	if (fclose(fptr->f2) < 0 && n2 == 0) {
+	    n2 = errno;
+	}
 	fptr->f2 = 0;
     }
     if (fptr->f) {
 	f1 = fileno(fptr->f);
-	while (n1 = 0, fclose(fptr->f) < 0) {
+	if ((f2 == -1) && (fptr->mode & FMODE_WBUF)) {
+	    while (n1 = 0, fflush(fptr->f) < 0) {
+		n1 = errno;
+		if (!rb_io_wait_writable(f1)) break;
+		if (!fptr->f) break;
+	    }
+	}
+	if (fclose(fptr->f) < 0 && n1 == 0) {
 	    n1 = errno;
-	    if (f2 != -1 || !(fptr->mode & FMODE_WBUF)) break;
-	    if (!rb_io_wait_writable(f1)) break;
-	    if (!fptr->f) break;
 	}
 	fptr->f = 0;
Index: test/io/nonblock/test_flush.rb
===================================================================
RCS file: test/io/nonblock/test_flush.rb
diff -N test/io/nonblock/test_flush.rb
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ test/io/nonblock/test_flush.rb	29 Nov 2004 02:58:45 -0000
@@ -0,0 +1,22 @@
+require 'test/unit'
+require 'io/nonblock'
+
+class TestIONonblock < Test::Unit::TestCase
+  def test_flush                # [ruby-dev:24985]
+    r,w = IO.pipe
+    w.nonblock = true
+    w.sync = false
+    w << "b"
+    w.flush
+    w << "a" * 4096
+    Thread.new {
+      Thread.pass
+      w.close
+    }
+    Thread.new {
+      Thread.pass
+      nil while r.read(4096)
+    }
+    w.flush 
+  end
+end


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

In This Thread