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:
parent
c30de1e38e
commit
60f86b2edb
2 changed files with 40 additions and 3 deletions
|
@ -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; }
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in a new issue