# \[Bug #1267\] DL::Handle#sym segfaults with nil

**URL:** <https://www.ruby-forum.com/t/bug-1267-dl-handle-sym-segfaults-with-nil/162554>\
**Category:** Development\
**Created:** [March 11, 2009, 10:43am UTC](https://www.ruby-forum.com/t/bug-1267-dl-handle-sym-segfaults-with-nil/162554 "2009-03-11T10:43:13Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [March 11, 2009, 10:43am UTC](https://www.ruby-forum.com/t/bug-1267-dl-handle-sym-segfaults-with-nil/162554/1 "2009-03-11T10:43:13Z")

</div>

Bug #1267: DL::Handle#sym segfaults with nil  
[http://redmine.ruby-lang.org/issues/show/1267](http://redmine.ruby-lang.org/issues/show/1267)

e$B5/I\<\<Te(B: Nobuyoshi N.  
e$B%9%F!\<%?%9e(B: Open, e$BM%@hEYe(B: Normal  
e$B%+%F%4%je(B: ext, Target version: 1.9.1  
ruby -v: ruby 1.9.2dev (2009-03-11 trunk 22881) [i386-darwin9.0]

DL::Handle#syme$B$K%7%s%%kL\>$H$7$Fe(Bnile$B$rEO$9$HBe$o$j$Ke(BRTLD\_NEXTe$B$r;He(B  
e$B$&$h$&$K$J$C$F$$$^$9$,!"e(BRTLD\_NEXTe$B$,EO$;$k$N$O%7%s%%kL\>$G$O$J$/e(B  
e$B$FBh0l0z?t$N%O%s%I%k$N$[$&$G$9!#e(B

e$B%O%s%I%k$K3:Ev$9$k$N$Oe(Bselfe$B$G$9$,!"$b$A$m$se(Bnile$B$OEO$7$h$&$,$G$-$Je(B  
e$B$$$N$G%/%i%9%a%=%C%I$rDj5A$9$k$N$O$I$&$G$7$g$&$+!#e(B

$ 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](http://www.ruby-lang.org/bugreport.html)

Abort trap

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [March 11, 2009, 12:17pm UTC](https://www.ruby-forum.com/t/bug-1267-dl-handle-sym-segfaults-with-nil/162554/2 "2009-03-11T12:17:56Z")

</div>

e$B%A%1%C%He(B #1267 e$B$,99?7$5$l$^$7$?!#e(B (by Nobuyoshi N.)

e$B%9%F!\<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B  
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

## Applied in changeset r22891.

[http://redmine.ruby-lang.org/issues/show/1267](http://redmine.ruby-lang.org/issues/show/1267)

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [March 11, 2009, 12:29pm UTC](https://www.ruby-forum.com/t/bug-1267-dl-handle-sym-segfaults-with-nil/162554/3 "2009-03-11T12:29:39Z")

</div>

e$B$J$+$@$G$9!#e(B

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

> DL::Handle#syme$B$K%7%s%%kL\>$H$7$Fe(Bnile$B$rEO$9$HBe$o$j$Ke(BRTLD\_NEXTe$B$r;He(B  
> e$B$&$h$&$K$J$C$F$$$^$9$,!"e(BRTLD\_NEXTe$B$,EO$;$k$N$O%7%s%%kL\>$G$O$J$/e(B  
> e$B$FBh0l0z?t$N%O%s%I%k$N$[$&$G$9!#e(B

SEGVe$B$9$k$N$OLdBj$J$N$G$H$j$"$($:e(Bnile$B$N07$$$OH4$-$^$7$?!#e(B

> e$B%O%s%I%k$K3:Ev$9$k$N$Oe(Bselfe$B$G$9$,!"$b$A$m$se(Bnile$B$OEO$7$h$&$,$G$-$Je(B  
> e$B$$$N$G%/%i%9%a%=%C%I$rDj5A$9$k$N$O$I$&$G$7$g$&$+!#e(B

e$B$3$A$i$O2~$a$Fe(Bfeature requeste$B$H$$$&$3$H$G!#e(B

# 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

- 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);
