[#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:24998] Re: rb_io_sysread dumps core [BUG] rb_sys_fail() - errno == 0

From: nobu@...
Date: 2004-11-30 08:44:06 UTC
List: ruby-dev #24998
なかだです。

At Tue, 30 Nov 2004 16:25:22 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:24997]:
> |TRAP_ENDではerrnoを保存しているので、それはないはずです。一つの
> |可能性としては、rb_io_sysread()ではrb_sys_fail()の直前で
> |rb_str_resize()を呼んでいるので、その中でクリアされているとか。
> 
> よく見るとどのrb_str_resize()も必須ではないようなので、削除
> しちゃいましょうか。

どうせ例外で通知されるので空にする必要もない、ということでしょ
うか。それでも(ドキュメントを直せば)問題はないんじゃないかと思
いますが、なんでそうしてたんでしたっけ、とcommit logを調べてみ
ると[ruby-bugs-ja PR#408]が最初のようです。

| 1.8 の IO#read(len, buf) (と、IO#sysread)の以下の振舞いはちょっ
| と不揃いに思えます。戻りが nil の場合は buf も空にしてしまう
| のが簡単?
| 
| * sysread() はあらかじめ buf を len バイトに切り詰めることも
|   するが、read() はしない。
| 
| * ファイルが空の場合、buf は最初のサイズ調整以外に変更されな
|   い。ただし、read() の場合は(おそらく仕方なく)先頭に "\0" 
|   が入ってしまう。
| 
|         io = File.open("/dev/null")
| 
|         buf = "x" * 20;
|         p io.read(10,buf)
|         p buf
| 
|         buf = "x" * 20;
|         p io.sysread(10,buf) rescue nil
|         p buf
| 
| 	=> ruby 1.8.0 (2003-03-12) [i586-linux]
| 	   nil
| 	   "\000xxxxxxxxxxxxxxxxxxx"
| 	   "xxxxxxxxxx"

前者に関しては、そもそも最初に切り詰める必要はなさそうな気がし
ます。後者は、io_fread()でnul terminateすること自体不要そうです。


Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.338
diff -u -2 -p -r1.338 io.c
--- io.c	29 Nov 2004 15:58:18 -0000	1.338
+++ io.c	30 Nov 2004 08:38:16 -0000
@@ -1010,5 +1010,4 @@ io_fread(ptr, len, fptr)
 		if (len == n) return 0;
 	    }
-	    *ptr = '\0';
 	    break;
 	}
@@ -1087,5 +1086,4 @@ read_all(fptr, siz, str)
 	rb_str_unlocktmp(str);
 	if (n == 0 && bytes == 0) {
-	    rb_str_resize(str,0);
 	    if (!fptr->f) break;
 	    if (feof(fptr->f)) break;
@@ -1165,5 +1163,5 @@ io_readpartial(argc, argv, io)
     OpenFile *fptr;
     VALUE length, str;
-    long n, len;
+    long n, len, olen;
 
     rb_scan_args(argc, argv, "11", &length, &str);
@@ -1174,10 +1172,11 @@ io_readpartial(argc, argv, io)
 
     if (NIL_P(str)) {
-	str = rb_str_new(0, len);
+	str = rb_str_new(0, olen = len);
     }
     else {
 	StringValue(str);
 	rb_str_modify(str);
-        rb_str_resize(str, len);
+	olen = RSTRING(str)->len;
+	if (len > olen) rb_str_resize(str, olen = len);
     }
     OBJ_TAINT(str);
@@ -1190,5 +1189,5 @@ io_readpartial(argc, argv, io)
 
     READ_CHECK(fptr->f);
-    if (RSTRING(str)->len != len) {
+    if (RSTRING(str)->len != olen) {
       modified:
 	rb_raise(rb_eRuntimeError, "buffer string modified");
@@ -1197,5 +1196,5 @@ io_readpartial(argc, argv, io)
     if (n <= 0) {
       again:
-	if (RSTRING(str)->len != len) goto modified;
+	if (RSTRING(str)->len != olen) goto modified;
         TRAP_BEG;
         n = read(fileno(fptr->f), RSTRING(str)->ptr, len);
@@ -1204,5 +1203,4 @@ io_readpartial(argc, argv, io)
             if (rb_io_wait_readable(fileno(fptr->f)))
                 goto again;
-            rb_str_resize(str, 0);
             rb_sys_fail(fptr->path);
         }
@@ -1237,5 +1235,5 @@ io_read(argc, argv, io)
 {
     OpenFile *fptr;
-    long n, len;
+    long n, len, olen;
     VALUE length, str;
 
@@ -1254,10 +1252,11 @@ io_read(argc, argv, io)
 
     if (NIL_P(str)) {
-	str = rb_tainted_str_new(0, len);
+	str = rb_tainted_str_new(0, olen = len);
     }
     else {
 	StringValue(str);
 	rb_str_modify(str);
-	rb_str_resize(str,len);
+	olen = RSTRING(str)->len;
+	if (len > olen) rb_str_resize(str, olen = len);
     }
 
@@ -1265,9 +1264,12 @@ io_read(argc, argv, io)
     rb_io_check_readable(fptr);
     if (feof(fptr->f)) return Qnil;
-    if (len == 0) return str;
+    if (len == 0) {
+	rb_str_resize(str, 0);
+	return str;
+    }
 
     rb_str_locktmp(str);
     READ_CHECK(fptr->f);
-    if (RSTRING(str)->len != len) {
+    if (RSTRING(str)->len != olen) {
 	rb_raise(rb_eRuntimeError, "buffer string modified");
     }
@@ -1275,11 +1277,9 @@ io_read(argc, argv, io)
     rb_str_unlocktmp(str);
     if (n == 0) {
-	rb_str_resize(str,0);
 	if (!fptr->f) return Qnil;
 	if (feof(fptr->f)) return Qnil;
 	if (len > 0) rb_sys_fail(fptr->path);
     }
-    RSTRING(str)->len = n;
-    RSTRING(str)->ptr[n] = '\0';
+    rb_str_resize(str, n);
     OBJ_TAINT(str);
 
@@ -2301,5 +2301,5 @@ rb_io_sysread(argc, argv, io)
     VALUE len, str;
     OpenFile *fptr;
-    long n, ilen;
+    long n, ilen, olen;
 
     rb_scan_args(argc, argv, "11", &len, &str);
@@ -2307,12 +2307,16 @@ rb_io_sysread(argc, argv, io)
 
     if (NIL_P(str)) {
-	str = rb_str_new(0, ilen);
+	str = rb_str_new(0, olen = ilen);
     }
     else {
 	StringValue(str);
 	rb_str_modify(str);
-	rb_str_resize(str, ilen);
+	olen = RSTRING(str)->len;
+	if (ilen > olen) rb_str_resize(str, olen = ilen);
+    }
+    if (ilen == 0) {
+	rb_str_resize(str, 0);
+	return str;
     }
-    if (ilen == 0) return str;
 
     GetOpenFile(io, fptr);
@@ -2327,5 +2331,5 @@ rb_io_sysread(argc, argv, io)
     rb_thread_wait_fd(fileno(fptr->f));
     rb_io_check_closed(fptr);
-    if (RSTRING(str)->len != ilen) {
+    if (RSTRING(str)->len != olen) {
 	rb_raise(rb_eRuntimeError, "buffer string modified");
     }
@@ -2336,9 +2340,7 @@ rb_io_sysread(argc, argv, io)
     rb_str_unlocktmp(str);
     if (n == -1) {
-	rb_str_resize(str, 0);
 	rb_sys_fail(fptr->path);
     }
     if (n == 0 && ilen > 0) {
-	rb_str_resize(str, 0);
 	rb_eof_error();
     }
@@ -2906,6 +2908,8 @@ pipe_open(argc, argv, mode)
     if (modef & FMODE_WRITABLE) close(arg.pw[0]);
     if (pid == -1) {
+	int saved_errno = errno;
 	if (modef & FMODE_READABLE) close(arg.pr[0]);
 	if (modef & FMODE_WRITABLE) close(arg.pw[1]);
+	errno = saved_errno;
 	rb_sys_fail(cmd);
     }


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

In This Thread