From 1eba61708ca08f04e05d340a95e224ba06e2856e Mon Sep 17 00:00:00 2001 From: yugui Date: Sun, 12 Apr 2009 14:02:54 +0000 Subject: merges r22883 from trunk into ruby_1_9_1. -- * ext/dl/handle.c (rb_dlhandle_sym): fixed heap corruption. [ruby-core:22822] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@23180 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ ext/dl/handle.c | 18 +++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6a4004a2a9..674a560345 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed Mar 11 13:03:12 2009 Nobuyoshi Nakada + + * ext/dl/handle.c (rb_dlhandle_sym): fixed heap corruption. + [ruby-core:22822] + Tue Mar 10 13:45:54 2009 Nobuyoshi Nakada * win32/Makefile.sub (LDFLAGS): moved -link to TRY_LINK, LINK_SO diff --git a/ext/dl/handle.c b/ext/dl/handle.c index 0d59da561d..aa051a9df1 100644 --- a/ext/dl/handle.c +++ b/ext/dl/handle.c @@ -160,6 +160,7 @@ rb_dlhandle_sym(VALUE self, VALUE sym) func = dlsym(handle, name); CHECK_DLERROR; +#if defined(FUNC_STDCALL) if( !func ){ int len = strlen(name); char *name_n; @@ -167,14 +168,12 @@ rb_dlhandle_sym(VALUE self, VALUE sym) { char *name_a = (char*)xmalloc(len+2); strcpy(name_a, name); + name_n = name_a; name_a[len] = 'A'; name_a[len+1] = '\0'; func = dlsym(handle, name_a); CHECK_DLERROR; - if( func ){ - xfree(name_a); - goto found; - } + if( func ) goto found; name_n = xrealloc(name_a, len+6); } #else @@ -188,7 +187,6 @@ rb_dlhandle_sym(VALUE self, VALUE sym) CHECK_DLERROR; if( func ) break; } - xfree(name_n); if( func ) goto found; name_n[len-1] = 'A'; name_n[len++] = '@'; @@ -198,11 +196,13 @@ rb_dlhandle_sym(VALUE self, VALUE sym) CHECK_DLERROR; if( func ) break; } - if( !func ){ - rb_raise(rb_eDLError, "unknown symbol \"%s\"", name); - } + found: + xfree(name_n); + } +#endif + if( !func ){ + rb_raise(rb_eDLError, "unknown symbol \"%s\"", name); } - found: return PTR2NUM(func); } -- cgit v1.2.3