From: "Nobuyoshi.Nakada" Date: 2000-10-18T13:42:58+09:00 Subject: [ruby-dev:11263] arguments to Win32API なかだです。 Win32API#initialize の import と export にちょっとチェックを追加してみ ました。copy-on-write な String でも大丈夫なはず。 diff -pruPX ./.excludes current/ext/Win32API/Win32API.c devel/ext/Win32API/Win32API.c --- current/ext/Win32API/Win32API.c Wed Aug 30 17:16:36 2000 +++ devel/ext/Win32API/Win32API.c Wed Oct 18 13:20:55 2000 @@ -46,6 +46,26 @@ Win32API_FreeLibrary(hdll) FreeLibrary(hdll); } +static VALUE parm_type(c, voidok) + int c, voidok; +{ + switch (c) { + case 'N': case 'n': case 'L': case 'l': + return INT2FIX(_T_NUMBER); + case 'P': case 'p': + return INT2FIX(_T_POINTER); + case 'I': case 'i': + return INT2FIX(_T_INTEGER); + case 'V': case 'v': + if (voidok) { + return INT2FIX(_T_VOID); + } + default: + rb_raise(rb_eArgError, + isprint(c) ? "invalid argument: %c" : "invalid argument: \\%.3o", c); + } +} + static VALUE Win32API_initialize(self, dllname, proc, import, export) VALUE self; @@ -91,59 +111,28 @@ Win32API_initialize(self, dllname, proc, ptr = RARRAY(import)->ptr; for (i = 0, len = RARRAY(import)->len; i < len; i++) { 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)); - 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; + if (!RSTRING(ptr[i])->len) { + rb_raise(rb_eArgError, "empty argument type"); } + rb_ary_push(a_import, parm_type(*(char *)RSTRING(ptr[i])->ptr, FALSE)); } 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; - } + rb_ary_push(a_import, parm_type(*s++, FALSE)); } break; } rb_iv_set(self, "__import__", a_import); - if (NIL_P(export)) { - ex = _T_VOID; + if (NIL_P(export) || !(Check_SafeStr(export), RSTRING(export)->len)) { + ex = INT2FIX(_T_VOID); } else { - Check_SafeStr(export); - switch (*RSTRING(export)->ptr) { - case 'V': case 'v': - ex = _T_VOID; - break; - case 'N': case 'n': case 'L': case 'l': - ex = _T_NUMBER; - break; - case 'P': case 'p': - ex = _T_POINTER; - break; - case 'I': case 'i': - ex = _T_INTEGER; - break; - } + ex = parm_type(*RSTRING(export)->ptr, TRUE); } - rb_iv_set(self, "__export__", INT2FIX(ex)); + rb_iv_set(self, "__export__", ex); return Qnil; } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦