@@ -48,10 +48,13 @@ Win32API_initialize(self, dllname, proc, import, export)
48
48
VALUE str ;
49
49
VALUE a_import ;
50
50
VALUE * ptr ;
51
+ char * s ;
51
52
int i ;
52
53
int len ;
53
54
int ex ;
54
55
56
+ Check_SafeStr (dllname );
57
+ Check_SafeStr (proc );
55
58
hdll = LoadLibrary (RSTRING (dllname )-> ptr );
56
59
if (!hdll )
57
60
rb_raise (rb_eRuntimeError , "LoadLibrary: %s\n" , RSTRING (dllname )-> ptr );
@@ -70,11 +73,13 @@ Win32API_initialize(self, dllname, proc, import, export)
70
73
rb_iv_set (self , "__proc__" , UINT2NUM ((unsigned long )hproc ));
71
74
72
75
a_import = rb_ary_new ();
73
- if (!NIL_P (import )) {
74
- Check_Type (import , T_ARRAY );
76
+ switch (TYPE (import )) {
77
+ case T_NIL :
78
+ break ;
79
+ case T_ARRAY :
75
80
ptr = RARRAY (import )-> ptr ;
76
81
for (i = 0 , len = RARRAY (import )-> len ; i < len ; i ++ ) {
77
- Check_Type (ptr [i ], T_STRING );
82
+ Check_SafeStr (ptr [i ]);
78
83
switch (* (char * )RSTRING (ptr [i ])-> ptr ) {
79
84
case 'N' : case 'n' : case 'L' : case 'l' :
80
85
rb_ary_push (a_import , INT2FIX (_T_NUMBER ));
@@ -87,13 +92,31 @@ Win32API_initialize(self, dllname, proc, import, export)
87
92
break ;
88
93
}
89
94
}
95
+ break ;
96
+ default :
97
+ Check_SafeStr (import );
98
+ s = RSTRING (import )-> ptr ;
99
+ for (i = 0 , len = RSTRING (import )-> len ; i < len ; i ++ ) {
100
+ switch (* s ++ ) {
101
+ case 'N' : case 'n' : case 'L' : case 'l' :
102
+ rb_ary_push (a_import , INT2FIX (_T_NUMBER ));
103
+ break ;
104
+ case 'P' : case 'p' :
105
+ rb_ary_push (a_import , INT2FIX (_T_POINTER ));
106
+ break ;
107
+ case 'I' : case 'i' :
108
+ rb_ary_push (a_import , INT2FIX (_T_INTEGER ));
109
+ break ;
110
+ }
111
+ }
112
+ break ;
90
113
}
91
114
rb_iv_set (self , "__import__" , a_import );
92
115
93
116
if (NIL_P (export )) {
94
117
ex = _T_VOID ;
95
118
} else {
96
- Check_Type (export , T_STRING );
119
+ Check_SafeStr (export );
97
120
switch (* RSTRING (export )-> ptr ) {
98
121
case 'V' : case 'v' :
99
122
ex = _T_VOID ;
0 commit comments