From: "Nobuyoshi.Nakada" Date: 2000-08-30T13:06:30+09:00 Subject: [ruby-dev:10724] Re: [PATCH] Win32API.c なかだです。 At Wed, 30 Aug 2000 11:42:47 +0900 WATANABE Hirofumi wrote: > : この間 Win32API を使ったら、うっかり3番目に nil を渡してしまって > :[BUG] とかいわれてしまったので、パッチです。 > > そのまま commit しました. どうも。 > ところで %w(L L) でもいいけど, そもそも pack/unpack みたいに > "LL" で十分じゃんという気がしないでもないというか, それも受 > け付けるようにすればいいのか. それも一応考えてはいたんですけど。じゃあついでに TAINT チェックもつけ て、こんなとこでどうでしょう。 diff -pruPX ./.excludes current/ext/Win32API/Win32API.c devel/ext/Win32API/Win32API.c --- current/ext/Win32API/Win32API.c Wed Aug 30 11:35:04 2000 +++ devel/ext/Win32API/Win32API.c Wed Aug 30 13:04:44 2000 @@ -48,10 +48,13 @@ Win32API_initialize(self, dllname, proc, VALUE str; VALUE a_import; VALUE *ptr; + char *s; int i; int len; int ex; + Check_SafeStr(dllname); + Check_SafeStr(proc); hdll = LoadLibrary(RSTRING(dllname)->ptr); if (!hdll) rb_raise(rb_eRuntimeError, "LoadLibrary: %s\n", RSTRING(dllname)->ptr); @@ -70,11 +73,13 @@ Win32API_initialize(self, dllname, proc, rb_iv_set(self, "__proc__", UINT2NUM((unsigned long)hproc)); a_import = rb_ary_new(); - if (!NIL_P(import)) { - Check_Type(import, T_ARRAY); + switch (TYPE(import)) { + case T_NIL: + break; + case T_ARRAY: ptr = RARRAY(import)->ptr; for (i = 0, len = RARRAY(import)->len; i < len; i++) { - Check_Type(ptr[i], T_STRING); + Check_SafeStr(ptr[i]); switch (*(char *)RSTRING(ptr[i])->ptr) { case 'N': case 'n': case 'L': case 'l': rb_ary_push(a_import, INT2FIX(_T_NUMBER)); @@ -87,13 +92,31 @@ Win32API_initialize(self, dllname, proc, break; } } + break; + default: + Check_SafeStr(import); + s = RSTRING(import)->ptr; + for (i = 0, len = RSTRING(import)->len; i < len; i++) { + switch (*s++) { + case 'N': case 'n': case 'L': case 'l': + rb_ary_push(a_import, INT2FIX(_T_NUMBER)); + break; + case 'P': case 'p': + rb_ary_push(a_import, INT2FIX(_T_POINTER)); + break; + case 'I': case 'i': + rb_ary_push(a_import, INT2FIX(_T_INTEGER)); + break; + } + } + break; } rb_iv_set(self, "__import__", a_import); if (NIL_P(export)) { ex = _T_VOID; } else { - Check_Type(export, T_STRING); + Check_SafeStr(export); switch (*RSTRING(export)->ptr) { case 'V': case 'v': ex = _T_VOID; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦