Skip to content

Commit

Permalink
[ruby/fiddle] Remove taint support (#21)
Browse files Browse the repository at this point in the history
Ruby 2.7 deprecates taint and it no longer has an effect.
The lack of taint support should not cause a problem in
previous Ruby versions.
ruby/fiddle@18d6fb6915
  • Loading branch information
jeremyevans authored and hsbt committed Oct 24, 2019
1 parent ce6caad commit b809784
Show file tree
Hide file tree
Showing 7 changed files with 9 additions and 58 deletions.
9 changes: 0 additions & 9 deletions ext/fiddle/function.c
Expand Up @@ -184,15 +184,6 @@ 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 +
Expand Down
8 changes: 3 additions & 5 deletions ext/fiddle/handle.c
@@ -1,8 +1,6 @@
#include <ruby.h>
#include <fiddle.h>

#define SafeStringValueCStr(v) (rb_check_safe_obj(rb_string_value(&v)), StringValueCStr(v))

VALUE rb_cHandle;

struct dl_handle {
Expand Down Expand Up @@ -145,11 +143,11 @@ rb_fiddle_handle_initialize(int argc, VALUE argv[], VALUE self)
cflag = RTLD_LAZY | RTLD_GLOBAL;
break;
case 1:
clib = NIL_P(lib) ? NULL : SafeStringValueCStr(lib);
clib = NIL_P(lib) ? NULL : StringValueCStr(lib);
cflag = RTLD_LAZY | RTLD_GLOBAL;
break;
case 2:
clib = NIL_P(lib) ? NULL : SafeStringValueCStr(lib);
clib = NIL_P(lib) ? NULL : StringValueCStr(lib);
cflag = NUM2INT(flag);
break;
default:
Expand Down Expand Up @@ -319,7 +317,7 @@ fiddle_handle_sym(void *handle, VALUE symbol)
# define CHECK_DLERROR
#endif
void (*func)();
const char *name = SafeStringValueCStr(symbol);
const char *name = StringValueCStr(symbol);

#ifdef HAVE_DLERROR
dlerror();
Expand Down
12 changes: 5 additions & 7 deletions ext/fiddle/pointer.c
Expand Up @@ -90,7 +90,6 @@ rb_fiddle_ptr_new2(VALUE klass, void *ptr, long size, freefunc_t func)
data->ptr = ptr;
data->free = func;
data->size = size;
OBJ_TAINT(val);

return val;
}
Expand Down Expand Up @@ -376,11 +375,11 @@ rb_fiddle_ptr_to_s(int argc, VALUE argv[], VALUE self)
TypedData_Get_Struct(self, struct ptr_data, &fiddle_ptr_data_type, data);
switch (rb_scan_args(argc, argv, "01", &arg1)) {
case 0:
val = rb_tainted_str_new2((char*)(data->ptr));
val = rb_str_new2((char*)(data->ptr));
break;
case 1:
len = NUM2INT(arg1);
val = rb_tainted_str_new((char*)(data->ptr), len);
val = rb_str_new((char*)(data->ptr), len);
break;
default:
rb_bug("rb_fiddle_ptr_to_s");
Expand Down Expand Up @@ -414,11 +413,11 @@ rb_fiddle_ptr_to_str(int argc, VALUE argv[], VALUE self)
TypedData_Get_Struct(self, struct ptr_data, &fiddle_ptr_data_type, data);
switch (rb_scan_args(argc, argv, "01", &arg1)) {
case 0:
val = rb_tainted_str_new((char*)(data->ptr),data->size);
val = rb_str_new((char*)(data->ptr),data->size);
break;
case 1:
len = NUM2INT(arg1);
val = rb_tainted_str_new((char*)(data->ptr), len);
val = rb_str_new((char*)(data->ptr), len);
break;
default:
rb_bug("rb_fiddle_ptr_to_str");
Expand Down Expand Up @@ -551,7 +550,7 @@ rb_fiddle_ptr_aref(int argc, VALUE argv[], VALUE self)
case 2:
offset = NUM2ULONG(arg0);
len = NUM2ULONG(arg1);
retval = rb_tainted_str_new((char *)data->ptr + offset, len);
retval = rb_str_new((char *)data->ptr + offset, len);
break;
default:
rb_bug("rb_fiddle_ptr_aref()");
Expand Down Expand Up @@ -669,7 +668,6 @@ rb_fiddle_ptr_s_to_ptr(VALUE self, VALUE val)
if (num == val) wrap = 0;
ptr = rb_fiddle_ptr_new(NUM2PTR(num), 0, NULL);
}
OBJ_INFECT(ptr, val);
if (wrap) RPTR_DATA(ptr)->wrap[0] = wrap;
return ptr;
}
Expand Down
12 changes: 0 additions & 12 deletions test/fiddle/test_func.rb
Expand Up @@ -11,18 +11,6 @@ def test_random
assert_nil f.call(10)
end

def test_syscall_with_tainted_string
f = Function.new(@libc['system'], [TYPE_VOIDP], TYPE_INT)
Thread.new {
$SAFE = 1
assert_raise(SecurityError) do
f.call("uname -rs".dup.taint)
end
}.join
ensure
$SAFE = 0
end

def test_sinf
begin
f = Function.new(@libm['sinf'], [TYPE_FLOAT], TYPE_FLOAT)
Expand Down
2 changes: 1 addition & 1 deletion test/fiddle/test_function.rb
Expand Up @@ -98,7 +98,7 @@ def test_nogvl_poll
end

def test_no_memory_leak
prep = 'r = Fiddle::Function.new(Fiddle.dlopen(nil)["rb_obj_tainted"], [Fiddle::TYPE_UINTPTR_T], Fiddle::TYPE_UINTPTR_T); a = "a"'
prep = 'r = Fiddle::Function.new(Fiddle.dlopen(nil)["rb_obj_frozen"], [Fiddle::TYPE_UINTPTR_T], Fiddle::TYPE_UINTPTR_T); a = "a"'
code = 'begin r.call(a); rescue TypeError; end'
assert_no_memory_leak(%w[-W0 -rfiddle], "#{prep}\n1000.times{#{code}}", "10_000.times {#{code}}", limit: 1.2)
end
Expand Down
23 changes: 0 additions & 23 deletions test/fiddle/test_handle.rb
Expand Up @@ -8,29 +8,6 @@ module Fiddle
class TestHandle < TestCase
include Fiddle

def test_safe_handle_open
Thread.new do
$SAFE = 1
assert_raise(SecurityError) {
Fiddle::Handle.new(LIBC_SO.dup.taint)
}
end.join
ensure
$SAFE = 0
end

def test_safe_function_lookup
Thread.new do
h = Fiddle::Handle.new(LIBC_SO)
$SAFE = 1
assert_raise(SecurityError) {
h["qsort".dup.taint]
}
end.join
ensure
$SAFE = 0
end

def test_to_i
handle = Fiddle::Handle.new(LIBC_SO)
assert_kind_of Integer, handle.to_i
Expand Down
1 change: 0 additions & 1 deletion test/fiddle/test_pointer.rb
Expand Up @@ -79,7 +79,6 @@ def test_inspect
def test_to_ptr_string
str = "hello world"
ptr = Pointer[str]
assert ptr.tainted?, 'pointer should be tainted'
assert_equal str.length, ptr.size
assert_equal 'hello', ptr[0,5]
end
Expand Down

0 comments on commit b809784

Please sign in to comment.