[#26266] pragma on ripper — nobuyoshi nakada <nobuyoshi.nakada@...>

なかだです。

15 messages 2005/06/02

[#26312] rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org>

最近、とあるプログラム(五月雨)が、無限ループに陥ることが何回かありました。

32 messages 2005/06/09
[#26323] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/10

In article <TYOMLEM04Rqf69aZbLA0000002d@tyomlvem02.e2k.ad.ge.com>,

[#26329] Re: rb_gc_mark_threads spin — nobu@... 2005/06/10

なかだです。

[#26331] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/11

In article <200506101543.j5AFhToG009328@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#26333] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/11

In article <8764wlil9l.fsf@m17n.org>,

[#26334] Re: rb_gc_mark_threads spin — nobu@... 2005/06/11

なかだです。

[#26337] Re: rb_gc_mark_threads spin — Tanaka Akira <akr@...17n.org> 2005/06/11

In article <200506111335.j5BDZkoG019423@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#26405] WEBrick DoS vulnerability — Tanaka Akira <akr@...17n.org>

NetBSD 2.0 で WEBrick を使って HTTP サーバを動かした場合、クライアント

24 messages 2005/06/29
[#26477] Re: WEBrick DoS vulnerability — GOTOU Yuuzou <gotoyuzo@...> 2005/07/08

ごとうゆうぞうです。

[#26480] Re: WEBrick DoS vulnerability — Tanaka Akira <akr@...17n.org> 2005/07/08

In article <20050708.175802.957830318.gotoyuzo@sawara.does.notwork.org>,

[#26481] Re: WEBrick DoS vulnerability — GOTOU Yuuzou <gotoyuzo@...> 2005/07/08

In message <87fyupzgcq.fsf@m17n.org>,

[#26421] Subversion — Shugo Maeda <shugo@...>

前田です。

24 messages 2005/06/30
[#26422] Re: Subversion — Yukihiro Matsumoto <matz@...> 2005/06/30

まつもと ゆきひろです

[#26423] Re: Subversion — "U.Nakamura" <usa@...> 2005/06/30

こんにちは、なかむら(う)です。

[ruby-dev:26360] win32版ではDBM系のtestでErrorがいっぱい

From: "U.Nakamura" <usa@...>
Date: 2005-06-20 06:16:14 UTC
List: ruby-dev #26360
こんにちは、なかむら(う)です。

最近忙しくて全然rubyを触れてないんですが、久しぶりにmswin32で
1.8の先っぽをコンパイルしてtest-allしてみたところ、山のように
エラーが出るようになっていることが判明しました。

何種類かのエラーがあるんですが、とりあえず数が多くて原因が同
じっぽいものをまとめてみたところ、dbm, gdbm, sdbmのテストの
teardownの中で、

(1) まだクローズされていないファイルを削除しようとしている
(2) 書き込み権限のないファイルを削除しようとしている

のが主たる原因のようです。
どっちもWindows(かそれに類する環境)でしか発生しない問題だろう
と思うのですが、これでは困っちゃうのでちょっと考えてみました。


(1)については、現状のテストを見ると GC.start を実行することに
よってGCされてファイルがクローズされていることを期待している
ように思うのですが、現実問題としてそうなっていません(それが問
題かどうかは私には判断できません)。

なので、より確実に、残存するDBM/GDBM/SDBMオブジェクトを集めて、
それらを片っ端からcloseすればいいかと思ったのですが、いずれも
既にcloseされているものを再度closeすると例外が発生する上に、
closeされているかどうかを判定する手段がないということに気づき
ました。

そこで、DBM/GDBM/SDBMの各クラスにclosed?というメソッドを追加
した上で、各テストのteardownで残存オブジェクトをcloseする、と
いう変更を提案します。


(2)については、MSVCRT.dllのunlink(2)がリードオンリーのファイ
ルを削除できないのが理由なので、単純にリードオンリー属性を落
としてから削除するようにしてみました。
こっちは純粋にwin32版のみに影響します。


以上をまとめたパッチです。
これでとりあえずtest-allのErrorが110個ほど減ります :)

Index: ext/dbm/dbm.c
===================================================================
RCS file: /home/cvs/ruby/ext/dbm/dbm.c,v
retrieving revision 1.24.2.6
diff -u -1 -p -r1.24.2.6 dbm.c
--- ext/dbm/dbm.c	9 Dec 2004 02:35:29 -0000	1.24.2.6
+++ ext/dbm/dbm.c	20 Jun 2005 06:14:05 -0000
@@ -73,2 +73,17 @@ fdbm_close(obj)
 
+static VALUE
+fdbm_closed(obj)
+    VALUE obj;
+{
+    struct dbmdata *dbmp;
+
+    Data_Get_Struct(obj, struct dbmdata, dbmp);
+    if (dbmp == 0)
+	return Qtrue;
+    if (dbmp->di_dbm == 0)
+	return Qtrue;
+
+    return Qfalse;
+}
+
 static VALUE fdbm_alloc _((VALUE));
@@ -752,2 +767,3 @@ Init_dbm()
     rb_define_method(rb_cDBM, "close", fdbm_close, 0);
+    rb_define_method(rb_cDBM, "closed?", fdbm_closed, 0);
     rb_define_method(rb_cDBM, "[]", fdbm_aref, 1);
Index: ext/gdbm/gdbm.c
===================================================================
RCS file: /home/cvs/ruby/ext/gdbm/gdbm.c,v
retrieving revision 1.27.2.4
diff -u -1 -p -r1.27.2.4 gdbm.c
--- ext/gdbm/gdbm.c	9 Dec 2004 02:35:28 -0000	1.27.2.4
+++ ext/gdbm/gdbm.c	20 Jun 2005 06:14:05 -0000
@@ -74,2 +74,17 @@ fgdbm_close(obj)
 
+static VALUE
+fgdbm_closed(obj)
+    VALUE obj;
+{
+    struct dbmdata *dbmp;
+
+    Data_Get_Struct(obj, struct dbmdata, dbmp);
+    if (dbmp == 0)
+	return Qtrue;
+    if (dbmp->di_dbm == 0)
+	return Qtrue;
+
+    return Qfalse;
+}
+
 static VALUE fgdbm_s_alloc _((VALUE));
@@ -943,2 +958,3 @@ Init_gdbm()
     rb_define_method(rb_cGDBM, "close", fgdbm_close, 0);
+    rb_define_method(rb_cGDBM, "closed?", fgdbm_closed, 0);
     rb_define_method(rb_cGDBM, "[]", fgdbm_aref, 1);
Index: ext/sdbm/init.c
===================================================================
RCS file: /home/cvs/ruby/ext/sdbm/init.c,v
retrieving revision 1.18.2.7
diff -u -1 -p -r1.18.2.7 init.c
--- ext/sdbm/init.c	9 Dec 2004 07:31:22 -0000	1.18.2.7
+++ ext/sdbm/init.c	20 Jun 2005 06:14:06 -0000
@@ -64,2 +64,17 @@ fsdbm_close(obj)
 
+static VALUE
+fsdbm_closed(obj)
+    VALUE obj;
+{
+    struct dbmdata *dbmp;
+
+    Data_Get_Struct(obj, struct dbmdata, dbmp);
+    if (dbmp == 0)
+	return Qtrue;
+    if (dbmp->di_dbm == 0)
+	return Qtrue;
+
+    return Qfalse;
+}
+
 static VALUE fsdbm_alloc _((VALUE));
@@ -736,2 +751,3 @@ Init_sdbm()
     rb_define_method(rb_cDBM, "close", fsdbm_close, 0);
+    rb_define_method(rb_cDBM, "closed?", fsdbm_closed, 0);
     rb_define_method(rb_cDBM, "[]", fsdbm_aref, 1);
Index: test/dbm/test_dbm.rb
===================================================================
RCS file: /home/cvs/ruby/test/dbm/test_dbm.rb,v
retrieving revision 1.1.2.3
diff -u -1 -p -r1.1.2.3 test_dbm.rb
--- test/dbm/test_dbm.rb	4 Jun 2005 05:59:16 -0000	1.1.2.3
+++ test/dbm/test_dbm.rb	20 Jun 2005 06:14:10 -0000
@@ -44,3 +44,5 @@ if defined? DBM
       assert_nil(@dbm_rdonly.close)
-      GC.start
+      ObjectSpace.each_object(DBM) do |obj|
+        obj.close unless obj.closed?
+      end
       File.delete *Dir.glob("tmptest_dbm*").to_a
Index: test/gdbm/test_gdbm.rb
===================================================================
RCS file: /home/cvs/ruby/test/gdbm/test_gdbm.rb,v
retrieving revision 1.1.2.4
diff -u -1 -p -r1.1.2.4 test_gdbm.rb
--- test/gdbm/test_gdbm.rb	4 Jun 2005 05:59:15 -0000	1.1.2.4
+++ test/gdbm/test_gdbm.rb	20 Jun 2005 06:14:10 -0000
@@ -41,3 +41,5 @@ if defined? GDBM
       assert_nil(@gdbm_rdonly.close)
-      GC.start
+      ObjectSpace.each_object(GDBM) do |obj|
+        obj.close unless obj.closed?
+      end
       File.delete *Dir.glob("tmptest_gdbm*").to_a
Index: test/sdbm/test_sdbm.rb
===================================================================
RCS file: /home/cvs/ruby/test/sdbm/test_sdbm.rb,v
retrieving revision 1.1.2.1
diff -u -1 -p -r1.1.2.1 test_sdbm.rb
--- test/sdbm/test_sdbm.rb	3 Jun 2005 16:43:39 -0000	1.1.2.1
+++ test/sdbm/test_sdbm.rb	20 Jun 2005 06:14:10 -0000
@@ -14,3 +14,5 @@ class TestSDBM < Test::Unit::TestCase
     assert_nil(@sdbm.close)
-    GC.start
+    ObjectSpace.each_object(SDBM) do |obj|
+      obj.close unless obj.closed?
+    end
     File.delete *Dir.glob("tmptest_sdbm*").to_a
Index: win32/win32.c
===================================================================
RCS file: /home/cvs/ruby/win32/win32.c,v
retrieving revision 1.103.2.27
diff -u -1 -p -r1.103.2.27 win32.c
--- win32/win32.c	18 May 2005 14:39:27 -0000	1.103.2.27
+++ win32/win32.c	20 Jun 2005 06:14:10 -0000
@@ -3435,2 +3435,22 @@ rb_w32_rmdir(const char *path)
 
+#undef unlink
+int
+rb_w32_unlink(const char *path)
+{
+    DWORD attr;
+    int ret;
+    RUBY_CRITICAL({
+	attr = GetFileAttributes(path);
+	if (attr != (DWORD)-1 && (attr & FILE_ATTRIBUTE_READONLY)) {
+	    attr &= ~FILE_ATTRIBUTE_READONLY;
+	    SetFileAttributes(path, attr);
+	}
+	ret = unlink(path);
+	if (ret < 0 && attr != (DWORD)-1) {
+	    SetFileAttributes(path, attr);
+	}
+    });
+    return ret;
+}
+
 #if !defined(__BORLANDC__) && !defined(_WIN32_WCE)
Index: win32/win32.h
===================================================================
RCS file: /home/cvs/ruby/win32/win32.h,v
retrieving revision 1.46.2.10
diff -u -1 -p -r1.46.2.10 win32.h
--- win32/win32.h	16 May 2005 13:22:09 -0000	1.46.2.10
+++ win32/win32.h	20 Jun 2005 06:14:10 -0000
@@ -130,2 +130,4 @@ extern "C++" {
 #define rmdir(p)		rb_w32_rmdir(p)
+#undef unlink
+#define unlink(p)		rb_w32_unlink(p)
 
@@ -193,2 +195,3 @@ extern int rb_w32_mkdir(const char *, in
 extern int rb_w32_rmdir(const char *);
+extern int rb_w32_unlink(const char*);
 

で、他にも、dbm系のテストの問題としては、

(3) Windowsには「読み込み禁止」という属性がない。
    厳密にはNTFS上では実現できるがrubyではさしあたってサポー
    トしてない。
(4) 例によってforkがない。

とかいうのも残ってるんですが、その辺はまた次回。

それでは。
-- 
U.Nakamura <usa@garbagecollect.jp>



In This Thread

Prev Next