https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2009-03-11T18:47:37Z
Ruby Issue Tracking System
Ruby master - Bug #1267: DL::Handle#sym segfaults with nil
https://redmine.ruby-lang.org/issues/1267?journal_id=3515
2009-03-11T18:47:37Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>File</strong> deleted (<del><i>dlhandle.diff</i></del>)</li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Bug #1267: DL::Handle#sym segfaults with nil
https://redmine.ruby-lang.org/issues/1267?journal_id=3516
2009-03-11T18:48:46Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>File</strong> <a href="/attachments/289">dlhandle.diff</a> <a class="icon-only icon-download" title="Download" href="/attachments/download/289/dlhandle.diff">dlhandle.diff</a> added</li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Bug #1267: DL::Handle#sym segfaults with nil
https://redmine.ruby-lang.org/issues/1267?journal_id=3517
2009-03-11T20:17:06Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>=begin<br>
Applied in changeset r22891.<br>
=end</p>
Ruby master - Bug #1267: DL::Handle#sym segfaults with nil
https://redmine.ruby-lang.org/issues/1267?journal_id=3518
2009-03-11T20:29:02Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul></ul><p>=begin<br>
なかだです。</p>
<p>At Wed, 11 Mar 2009 18:40:15 +0900,<br>
Nobuyoshi Nakada wrote in <a href="/issues/1267">[ruby-dev:38150]</a>:</p>
<blockquote>
<p>DL::Handle#symにシンボル名としてnilを渡すと代わりにRTLD_NEXTを使<br>
うようになっていますが、RTLD_NEXTが渡せるのはシンボル名ではなく<br>
て第一引数のハンドルのほうです。</p>
</blockquote>
<p>SEGVするのは問題なのでとりあえずnilの扱いは抜きました。</p>
<blockquote>
<p>ハンドルに該当するのはselfですが、もちろんnilは渡しようができな<br>
いのでクラスメソッドを定義するのはどうでしょうか。</p>
</blockquote>
<p>こちらは改めてfeature requestということで。</p>
<h1>
<br>
Index: ext/dl/handle.c</h1>
<p>--- ext/dl/handle.c (revision 22891)<br>
+++ ext/dl/handle.c (working copy)<br>
@@ -130,17 +130,11 @@ rb_dlhandle_to_i(VALUE self)<br>
}</p>
<p>+static VALUE dlhandle_sym(void *handle, const char *symbol);<br>
+<br>
VALUE<br>
rb_dlhandle_sym(VALUE self, VALUE sym)<br>
{</p>
<ul>
<li>
<p>void (*func)();<br>
struct dl_handle *dlhandle;</p>
</li>
<li>
<p>void *handle;<br>
const char *name;<br>
-#if defined(HAVE_DLERROR)</p>
</li>
<li>
<p>const char *err;<br>
-# define CHECK_DLERROR if( err = dlerror() ){ func = 0; }<br>
-#else<br>
-# define CHECK_DLERROR<br>
-#endif</p>
<p>rb_secure(2);<br>
@@ -152,7 +146,31 @@ rb_dlhandle_sym(VALUE self, VALUE sym)<br>
rb_raise(rb_eDLError, "closed handle");<br>
}</p>
</li>
<li>
<p>handle = dlhandle->ptr;</p>
</li>
<li>
<p>func = dlsym(handle, name);</p>
</li>
</ul>
<ul>
<li>return dlhandle_sym(dlhandle->ptr, StringValuePtr(sym));<br>
+}</li>
<li>
</ul>
<p>+VALUE<br>
+rb_dlhandle_s_sym(VALUE self, VALUE sym)<br>
+{<br>
+#ifdef RTLD_NEXT</p>
<ul>
<li>void *handle = RTLD_NEXT;<br>
+#else</li>
<li>void *handle = NULL;<br>
+#endif</li>
<li>rb_secure(2);</li>
<li>return dlhandle_sym(handle, StringValuePtr(sym));<br>
+}</li>
<li>
</ul>
<p>+static VALUE<br>
+dlhandle_sym(void *handle, const char *name)<br>
+{<br>
+#if defined(HAVE_DLERROR)</p>
<ul>
<li>const char *err;<br>
+# define CHECK_DLERROR if( err = dlerror() ){ func = 0; }<br>
+#else<br>
+# define CHECK_DLERROR<br>
+#endif</li>
<li>void (*func)() = dlsym(handle, name);</li>
<li>CHECK_DLERROR;<br>
#if defined(FUNC_STDCALL)<br>
@@ -209,4 +227,6 @@ Init_dlhandle(void)<br>
rb_cDLHandle = rb_define_class_under(rb_mDL, "Handle", rb_cObject);<br>
rb_define_alloc_func(rb_cDLHandle, rb_dlhandle_s_allocate);</li>
<li>rb_define_singleton_method(rb_cDLHandle, "sym", rb_dlhandle_s_sym, 1);</li>
<li>rb_define_singleton_method(rb_cDLHandle, "[]", rb_dlhandle_s_sym, 1);<br>
rb_define_method(rb_cDLHandle, "initialize", rb_dlhandle_initialize, -1);<br>
rb_define_method(rb_cDLHandle, "to_i", rb_dlhandle_to_i, 0);<br>
</li>
</ul>
<p>--<br>
--- 僕の前にBugはない。<br>
--- 僕の後ろにBugはできる。<br>
中田 伸悦</p>
<p>=end</p>