diff options
Diffstat (limited to 'ext/fiddle/function.c')
| -rw-r--r-- | ext/fiddle/function.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/ext/fiddle/function.c b/ext/fiddle/function.c index 994402e26b..8e280567db 100644 --- a/ext/fiddle/function.c +++ b/ext/fiddle/function.c @@ -99,8 +99,6 @@ initialize(int argc, VALUE argv[], VALUE self) void *cfunc; rb_scan_args(argc, argv, "31:", &ptr, &args, &ret_type, &abi, &kwds); - rb_iv_set(self, "@closure", ptr); - ptr = rb_Integer(ptr); cfunc = NUM2PTR(ptr); PTR2NUM(cfunc); @@ -115,7 +113,7 @@ initialize(int argc, VALUE argv[], VALUE self) Check_Max_Args("args", len); ary = rb_ary_subseq(args, 0, len); for (i = 0; i < RARRAY_LEN(args); i++) { - VALUE a = RARRAY_AREF(args, i); + VALUE a = RARRAY_PTR(args)[i]; int type = NUM2INT(a); (void)INT2FFI_TYPE(type); /* raise */ if (INT2FIX(type) != a) rb_ary_store(ary, i, INT2FIX(type)); @@ -184,6 +182,15 @@ function_call(int argc, VALUE argv[], VALUE self) TypedData_Get_Struct(self, ffi_cif, &function_data_type, args.cif); + if (rb_safe_level() >= 1) { + for (i = 0; i < argc; i++) { + VALUE src = argv[i]; + if (OBJ_TAINTED(src)) { + rb_raise(rb_eSecurityError, "tainted parameter not allowed"); + } + } + } + generic_args = ALLOCV(alloc_buffer, (size_t)(argc + 1) * sizeof(void *) + (size_t)argc * sizeof(fiddle_generic)); args.values = (void **)((char *)generic_args + @@ -207,7 +214,7 @@ function_call(int argc, VALUE argv[], VALUE self) args.values[i] = (void *)&generic_args[i]; } args.values[argc] = NULL; - args.fn = (void(*)(void))NUM2PTR(cfunc); + args.fn = NUM2PTR(cfunc); (void)rb_thread_call_without_gvl(nogvl_ffi_call, &args, 0, 0); |
