1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* ext/dl/handle.c (rb_dlhandle_sym) refactoring rb_secure(2)

* test/dl/test_handle.rb (**) testing sym behavior

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25460 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
tenderlove 2009-10-25 00:11:15 +00:00
parent c30de1e38e
commit 60f86b2edb
2 changed files with 40 additions and 3 deletions

View file

@ -218,8 +218,6 @@ rb_dlhandle_sym(VALUE self, VALUE sym)
{
struct dl_handle *dlhandle;
rb_secure(2);
TypedData_Get_Struct(self, struct dl_handle, &dlhandle_data_type, dlhandle);
if( ! dlhandle->open ){
rb_raise(rb_eDLError, "closed handle");
@ -235,16 +233,26 @@ rb_dlhandle_sym(VALUE self, VALUE sym)
#define RTLD_DEFAULT NULL
#endif
/*
* Document-method: sym
* Document-method: []
*
* call-seq: sym(name)
*
* Get the address as an Integer for the function named +name+. The function
* is searched via dlsym on RTLD_NEXT. See man(3) dlsym() for more info.
*/
VALUE
rb_dlhandle_s_sym(VALUE self, VALUE sym)
{
rb_secure(2);
return dlhandle_sym(RTLD_NEXT, StringValueCStr(sym));
}
static VALUE
dlhandle_sym(void *handle, const char *name)
{
rb_secure(2);
#if defined(HAVE_DLERROR)
const char *err;
# define CHECK_DLERROR if( err = dlerror() ){ func = 0; }

View file

@ -2,6 +2,25 @@ require 'test_base'
module DL
class TestHandle < TestBase
def test_static_sym_secure
assert_raises(SecurityError) do
Thread.new do
$SAFE = 2
DL::Handle.sym('calloc')
end.join
end
end
def test_static_sym_unknown
assert_raises(DL::DLError) { DL::Handle.sym('fooo') }
assert_raises(DL::DLError) { DL::Handle['fooo'] }
end
def test_static_sym
assert DL::Handle.sym('dlopen')
assert_equal DL::Handle.sym('dlopen'), DL::Handle['dlopen']
end
def test_sym_closed_handle
handle = DL::Handle.new(LIBC_SO)
handle.close
@ -21,6 +40,16 @@ module DL
assert_raises(TypeError) { handle[nil] }
end
def test_sym_secure
assert_raises(SecurityError) do
Thread.new do
$SAFE = 2
handle = DL::Handle.new(LIBC_SO)
handle.sym('calloc')
end.join
end
end
def test_sym
handle = DL::Handle.new(LIBC_SO)
assert handle.sym('calloc')