Project

General

Profile

Actions

Bug #1267

closed

DL::Handle#sym segfaults with nil

Added by nobu (Nobuyoshi Nakada) about 12 years ago. Updated almost 10 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
ruby -v:
ruby 1.9.2dev (2009-03-11 trunk 22881) [i386-darwin9.0]
Backport:
[ruby-dev:38150]

Description

=begin
DL::Handle#symにシンボル名としてnilを渡すと代わりにRTLD_NEXTを使
うようになっていますが、RTLD_NEXTが渡せるのはシンボル名ではなく
て第一引数のハンドルのほうです。

ハンドルに該当するのはselfですが、もちろんnilは渡しようができな
いのでクラスメソッドを定義するのはどうでしょうか。

$ ruby -rdl -e 'p DL::Handle.new("libc.dylib").sym(nil)'
-e:1: [BUG] Segmentation fault
ruby 1.9.2dev (2009-03-11 trunk 22881) [i386-darwin9.0]

-- control frame ----------
c:0004 p:---- s:0011 b:0011 l:000010 d:000010 CFUNC :sym
c:0003 p:0027 s:0007 b:0006 l:001fc4 d:001d84 EVAL -e:1
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:001fc4 d:001fc4 TOP :45920


-e:1:in <main>'
-e:1:in
sym'

-- C level backtrace information -------------------------------------------

[NOTE]
You may have encountered a bug in the Ruby interpreter. Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

Abort trap
=end


Files

dlhandle.diff (2.08 KB) dlhandle.diff DL::Handle.sym & DL::Handle.[] nobu (Nobuyoshi Nakada), 03/11/2009 06:48 PM
Actions #1

Updated by nobu (Nobuyoshi Nakada) about 12 years ago

  • File deleted (dlhandle.diff)

=begin

=end

Actions #2

Updated by nobu (Nobuyoshi Nakada) about 12 years ago

=begin

=end

Actions #3

Updated by nobu (Nobuyoshi Nakada) about 12 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
Applied in changeset r22891.
=end

Actions #4

Updated by nobu (Nobuyoshi Nakada) about 12 years ago

=begin
なかだです。

At Wed, 11 Mar 2009 18:40:15 +0900,
Nobuyoshi Nakada wrote in [ruby-dev:38150]:

DL::Handle#symにシンボル名としてnilを渡すと代わりにRTLD_NEXTを使
うようになっていますが、RTLD_NEXTが渡せるのはシンボル名ではなく
て第一引数のハンドルのほうです。

SEGVするのは問題なのでとりあえずnilの扱いは抜きました。

ハンドルに該当するのはselfですが、もちろんnilは渡しようができな
いのでクラスメソッドを定義するのはどうでしょうか。

こちらは改めてfeature requestということで。

Index: ext/dl/handle.c
===================================================================
--- ext/dl/handle.c (revision 22891)
+++ ext/dl/handle.c (working copy)
@@ -130,17 +130,11 @@ rb_dlhandle_to_i(VALUE self)
}

+static VALUE dlhandle_sym(void *handle, const char *symbol);
+
VALUE
rb_dlhandle_sym(VALUE self, VALUE sym)
{

  • void (*func)(); struct dl_handle *dlhandle;
  • void *handle; const char *name; -#if defined(HAVE_DLERROR)
  • const char *err;
    -# define CHECK_DLERROR if( err = dlerror() ){ func = 0; }
    -#else
    -# define CHECK_DLERROR
    -#endif

    rb_secure(2);
    @@ -152,7 +146,31 @@ rb_dlhandle_sym(VALUE self, VALUE sym)
    rb_raise(rb_eDLError, "closed handle");
    }

  • handle = dlhandle->ptr;

  • func = dlsym(handle, name);

  • return dlhandle_sym(dlhandle->ptr, StringValuePtr(sym));
    +}
    +
    +VALUE
    +rb_dlhandle_s_sym(VALUE self, VALUE sym)
    +{
    +#ifdef RTLD_NEXT

  • void *handle = RTLD_NEXT;
    +#else

  • void *handle = NULL;
    +#endif

  • rb_secure(2);

  • return dlhandle_sym(handle, StringValuePtr(sym));
    +}
    +
    +static VALUE
    +dlhandle_sym(void *handle, const char *name)
    +{
    +#if defined(HAVE_DLERROR)

  • const char *err;
    +# define CHECK_DLERROR if( err = dlerror() ){ func = 0; }
    +#else
    +# define CHECK_DLERROR
    +#endif

  • void (*func)() = dlsym(handle, name);
    +
    CHECK_DLERROR;
    #if defined(FUNC_STDCALL)
    @@ -209,4 +227,6 @@ Init_dlhandle(void)
    rb_cDLHandle = rb_define_class_under(rb_mDL, "Handle", rb_cObject);
    rb_define_alloc_func(rb_cDLHandle, rb_dlhandle_s_allocate);

  • rb_define_singleton_method(rb_cDLHandle, "sym", rb_dlhandle_s_sym, 1);

  • rb_define_singleton_method(rb_cDLHandle, "[]", rb_dlhandle_s_sym, 1);
    rb_define_method(rb_cDLHandle, "initialize", rb_dlhandle_initialize, -1);
    rb_define_method(rb_cDLHandle, "to_i", rb_dlhandle_to_i, 0);

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

=end

Actions

Also available in: Atom PDF