[#21809] lib/test/unit/ui/tk/testrunner.rb — Kazuhiro NISHIYAMA <zn@...>

西山和広です。

23 messages 2003/11/01
[#21815] Re: lib/test/unit/ui/tk/testrunner.rb — Hidetoshi NAGAI <nagai@...> 2003/11/01

永井@知能.九工大です.

[#21858] Re: lib/test/unit/ui/tk/testrunner.rb — nobu.nakada@... 2003/11/06

なかだです。

[#21859] Re: lib/test/unit/ui/tk/testrunner.rb — Hidetoshi NAGAI <nagai@...> 2003/11/06

永井@知能.九工大です.

[#21860] Re: lib/test/unit/ui/tk/testrunner.rb — nobu.nakada@... 2003/11/06

なかだです。

[#21861] Re: lib/test/unit/ui/tk/testrunner.rb — Hidetoshi NAGAI <nagai@...> 2003/11/07

永井@知能.九工大です.

[#21862] Re: lib/test/unit/ui/tk/testrunner.rb — nobu.nakada@... 2003/11/07

なかだです。

[#21946] Re: [ruby-cvs] ruby, ruby/lib, ruby/test/fileutils: * lib/fileutils.rb (fu_same?): check by inode instead of path name, to detect two hard links pointing to the same content. — "U.Nakamura" <usa@...>

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

14 messages 2003/11/18
[#21972] Re: [ruby-cvs] ruby, ruby/lib, ruby/test/fileutils: * lib/fileutils.rb (fu_same?): check by inode instead of path name, to detect two hard links pointing to the same content. — siena@... (Siena. / SHINAGAWA, Norihide) 2003/11/19

Siena. です。

[#22013] HTTP_PROXY — Tanaka Akira <akr@...17n.org>

ふと

19 messages 2003/11/24

[#22042] ENV["path"].tainted? — Tanaka Akira <akr@...17n.org>

ENV["path"] の値が

14 messages 2003/11/25
[#22043] Re: ENV["path"].tainted? — matz@... (Yukihiro Matsumoto) 2003/11/25

まつもと ゆきひろです

[#22071] Dir.glob と Shjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

はじめまして。山本といいます。

119 messages 2003/11/28
[#22075] Re: Dir.glob と Shjift_JIS について — siena@... (Siena. / SHINAGAWA, Norihide) 2003/11/29

Siena. です。

[#22076] Re: Dir.glob と Shjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/11/29

> 山本さんのパッチがうまく当たらず手パッチしたので、念のため何度か

[#22078] Re: Dir.glob と Shjift_JIS について — siena@... (Siena. / SHINAGAWA, Norihide) 2003/11/29

Siena. です。

[#22089] Re: Dir.glob と Shjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/11/30

こんにちは、山本です。

[#22100] Re: Dir.glob と Shjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/01

山本です。

[#22147] Re: Dir.glob と Shjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/05

山本です。

[#22258] Re: Dir.glob と Shjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/13

山本です。glob_helperをリファクタリングしてみました。

[#22263] Re: Dir.glob と Shjift_JIS について — nobu.nakada@... 2003/12/13

なかだです。

[#22267] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/13

山本です。

[#22441] Re: Dir.glob と Shjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/27

山本です。

[#22442] Re: Dir.glob と Shjift_JIS について — matz@... (Yukihiro Matsumoto) 2003/12/27

まつもと ゆきひろです

[#22443] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/28

山本です。

[#22444] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/28

山本です。パッチを送ります。

[#22445] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/28

山本です。

[#22446] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/28

山本です。

[#22447] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/28

山本です。

[#22449] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/29

山本です。

[#22451] Re: Dir.glob とShjift_JIS について — matz@... (Yukihiro Matsumoto) 2003/12/29

まつもと ゆきひろです

[#22452] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/30

>すいません。パッチを出す時にはいつもどの時点のソースに対する

[#22453] Re: Dir.glob とShjift_JIS について — matz@... (Yukihiro Matsumoto) 2003/12/30

まつもと ゆきひろです

[#22454] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/30

>|すみません、1.8.1に対してです。

[#22455] Re: Dir.glob とShjift_JIS について — matz@... (Yukihiro Matsumoto) 2003/12/30

まつもと ゆきひろです

[#22456] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/30

こんにちは、山本です。

[#22457] Re: Dir.glob とShjift_JIS について — matz@... (Yukihiro Matsumoto) 2003/12/30

まつもと ゆきひろです

[#22470] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/31

山本です。

[#22471] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/01/01

山本です。

[#22476] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/01/02

山本です。[ruby-dev:22470]にバグがあったので修正しました。

[#22477] Re: Dir.glob とShjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/01/02

>山本です。[ruby-dev:22470]にバグがあったので修正しました。

[#22478] Re: Dir.glob とShjift_JIS について — matz@... (Yukihiro Matsumoto) 2004/01/02

まつもと ゆきひろです

[#22151] Re: Dir.glob と Shjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2003/12/05

山本です。

[ruby-dev:21991] Re: [ruby-list:38619] dl and win32 API call

From: Tietew <tietew-ml-ruby-dev@...>
Date: 2003-11-21 05:29:22 UTC
List: ruby-dev #21991
Tietew です。

On Mon, 20 Oct 2003 23:53:22 +0900
In article <20031020232800.AA1F.ARTONX@yahoo.co.jp>
[[ruby-list:38619] dl and win32 API call]
arton <artonx@yahoo.co.jp> wrote:

> win32に特化した問題ですが、ruby-win32が止まっているようなのでこちらに振
> ります。

まだ止まってますか?

> 主題:ruby-1.8.0添付のdlを利用してWIN32 APIを呼び出すとスタックポインタ
> がずれる。元の話題はhttp://www.tietew.jp/beckrb/msg00113.html です。
> 詳細:WIN32 APIでは、引数のスタックからのポップを呼ばれた側が実行する。
> しかし、dlは関数呼出し後に引数をスタックからポップする。そのため、引数の
> 分だけ余分にスタックポインタがポップされてしまう。

問題提起拾ってもらったのにほっぽってしまってすみません。

上記に関連して,MSVC のランタイムスタックチェックをすり抜けられ
るパッチを作ってみました。(-RTCs を付けていても abort しない)

mswin32 でしか確認できてないのですが,呼び出しが終わった後,全て
のレジスタが正常になっていることを確認しています。

i686-linux でのコンパイルでも,dl.so の make test は正常に終了し
ました。

alloca を呼ぶとスタックフレームが保存されるというコンパイラの仕
様をアテにしているので,他の環境でも問題ないか検証をお願いしたい
です。



Index: ext/Win32API/Win32API.c
===================================================================
RCS file: /src/ruby/ext/Win32API/Win32API.c,v
retrieving revision 1.19
diff -p -u -2 -r1.19 Win32API.c
--- ext/Win32API/Win32API.c	13 Aug 2003 04:52:35 -0000	1.19
+++ ext/Win32API/Win32API.c	21 Nov 2003 05:13:24 -0000
@@ -138,4 +138,22 @@ Win32API_initialize(self, dllname, proc,
 }
 
+#ifdef __MSVC_RUNTIME_CHECKS
+# pragma runtime_checks("s", off)
+#endif
+#ifdef _MSC_VER
+__declspec(noinline)
+#endif
+static unsigned long
+CallApiFunction(ApiFunction, param)
+    FARPROC ApiFunction;
+    struct { unsigned long params[16]; } param;
+{
+    volatile char *guard = ALLOCA_N(char, 1); /* guard stack pointer */
+    return ApiFunction(param);
+}
+#ifdef __MSVC_RUNTIME_CHECKS
+# pragma runtime_checks("s", restore)
+#endif
+
 static VALUE
 Win32API_Call(argc, argv, obj)
@@ -189,5 +207,5 @@ Win32API_Call(argc, argv, obj)
     }
 
-    ret = ApiFunction(param);
+    ret = CallApiFunction(ApiFunction, param);
 
     switch (FIX2INT(obj_export)) {
Index: ext/dl/dl.h
===================================================================
RCS file: /src/ruby/ext/dl/dl.h,v
retrieving revision 1.8
diff -p -u -2 -r1.8 dl.h
--- ext/dl/dl.h	7 Nov 2002 16:42:07 -0000	1.8
+++ ext/dl/dl.h	21 Nov 2003 05:13:24 -0000
@@ -171,4 +171,5 @@
 #elif defined(USE_DLSTACK)
 # define DLSTACK
+# define DLSTACK_GUARD
 # define DLSTACK_METHOD "dl"
 # define DLSTACK_PROTO long,long,long,long,long,\
Index: ext/dl/sym.c
===================================================================
RCS file: /src/ruby/ext/dl/sym.c,v
retrieving revision 1.21
diff -p -u -2 -r1.21 sym.c
--- ext/dl/sym.c	8 Nov 2003 13:32:07 -0000	1.21
+++ ext/dl/sym.c	21 Nov 2003 05:13:24 -0000
@@ -353,4 +353,88 @@ rb_dl_win32_set_last_error(VALUE self, V
 #endif
 
+#ifdef DLSTACK_GUARD
+# ifdef __MSVC_RUNTIME_CHECKS
+# pragma runtime_checks("s", off)
+# endif
+#ifdef _MSC_VER
+__declspec(noinline)
+#endif
+static int
+rb_dlsym_guardcall(char type, ANY_TYPE *ret, long *stack, void *func)
+{
+  volatile char *guard = ALLOCA_N(char, 1); /* guard stack pointer */
+  switch(type){
+  case '0':
+    {
+      void (*f)(DLSTACK_PROTO) = func;
+      f(DLSTACK_ARGS);
+    }
+    break;
+  case 'P':
+  case 'p':
+    {
+      void * (*f)(DLSTACK_PROTO) = func;
+      ret->p = f(DLSTACK_ARGS);
+    }
+    break;
+  case 'C':
+  case 'c':
+    {
+      char (*f)(DLSTACK_PROTO) = func;
+      ret->c = f(DLSTACK_ARGS);
+    }
+    break;
+  case 'H':
+  case 'h':
+    {
+      short (*f)(DLSTACK_PROTO) = func;
+      ret->h = f(DLSTACK_ARGS);
+    }
+    break;
+  case 'I':
+  case 'i':
+    {
+      int (*f)(DLSTACK_PROTO) = func;
+      ret->i = f(DLSTACK_ARGS);
+    }
+    break;
+  case 'L':
+  case 'l':
+    {
+      long (*f)(DLSTACK_PROTO) = func;
+      ret->l = f(DLSTACK_ARGS);
+    }
+    break;
+  case 'F':
+  case 'f':
+    {
+      float (*f)(DLSTACK_PROTO) = func;
+      ret->f = f(DLSTACK_ARGS);
+    }
+    break;
+  case 'D':
+  case 'd':
+    {
+      double (*f)(DLSTACK_PROTO) = func;
+      ret->d = f(DLSTACK_ARGS);
+    }
+    break;
+  case 'S':
+  case 's':
+    {
+      char * (*f)(DLSTACK_PROTO) = func;
+      ret->s = f(DLSTACK_ARGS);
+    }
+    break;
+  default:
+    return 0;
+  }
+  return 1;
+}
+# ifdef __MSVC_RUNTIME_CHECKS
+# pragma runtime_checks("s", restore)
+# endif
+#endif /* defined(DLSTACK_GUARD) */
+
 VALUE
 rb_dlsym_call(int argc, VALUE argv[], VALUE self)
@@ -643,4 +727,10 @@ rb_dlsym_call(int argc, VALUE argv[], VA
   DLSTACK_END(sym->type);
 
+#ifdef DLSTACK_GUARD
+  if(!rb_dlsym_guardcall(sym->type[0], &ret, stack, func)) {
+    FREE_ARGS;
+    rb_raise(rb_eDLTypeError, "unknown type `%c'", sym->type[0]);
+  }
+#else /* defined(DLSTACK_GUARD) */
   {
     switch( sym->type[0] ){
@@ -712,4 +802,5 @@ rb_dlsym_call(int argc, VALUE argv[], VA
     }
   }
+#endif /* defubed(DLSTACK_GUARD) */
 
   {


—[ Tietew ]——————————————————————————
 メ : tietew@tietew.net / tietew@raug.net / tietew@masuclub.net
ホペ: http://www.tietew.net/     Tietew Windows Lab.
      http://www.masuclub.net/   鱒倶楽部
指紋: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA


In This Thread

Prev Next