summaryrefslogtreecommitdiffstats
path: root/ext/dl
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-02 01:50:56 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-02 01:50:56 +0000
commit14760f7beff6a1f281f2c5a8bedd8048ad0f8e9a (patch)
tree194f7b4201d024600479cca93c352dda5a91f1ff /ext/dl
parentacd7f139c4c4271420861e52a7dca914d8b07917 (diff)
downloadruby-14760f7beff6a1f281f2c5a8bedd8048ad0f8e9a.tar.gz
ruby-14760f7beff6a1f281f2c5a8bedd8048ad0f8e9a.tar.xz
ruby-14760f7beff6a1f281f2c5a8bedd8048ad0f8e9a.zip
* ext/dl/handle.c (rb_dlhandle_sym): get rid of buffer overrun,
and try ASCII WINAPI versions too. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@22702 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/dl')
-rw-r--r--ext/dl/handle.c55
1 files changed, 25 insertions, 30 deletions
diff --git a/ext/dl/handle.c b/ext/dl/handle.c
index b727f4676..b8752004b 100644
--- a/ext/dl/handle.c
+++ b/ext/dl/handle.c
@@ -160,53 +160,48 @@ rb_dlhandle_sym(VALUE self, VALUE sym)
func = dlsym(handle, name);
CHECK_DLERROR;
if( !func ){
-#if defined(__CYGWIN__) || defined(WIN32) || defined(__MINGW32__)
+ int len = strlen(name);
+ char *name_n;
+#if defined(__CYGWIN__) || defined(_WIN32) || defined(__MINGW32__)
{
- int len = strlen(name);
char *name_a = (char*)xmalloc(len+2);
strcpy(name_a, name);
name_a[len] = 'A';
name_a[len+1] = '\0';
func = dlsym(handle, name_a);
- xfree(name_a);
CHECK_DLERROR;
- if( !func ){
- for( i = 0; i < 256; i += 4 ){
- int len = strlen(name);
- char *name_n = (char*)xmalloc(len+5);
- sprintf(name_n, "%s@%d%c", name, i, 0);
- func = dlsym(handle, name_n);
- xfree(name_n);
- CHECK_DLERROR;
- if( func )
- {
- break;
- }
- }
- CHECK_DLERROR;
- if( !func ){
- rb_raise(rb_eDLError, "unknown symbol \"%s\"", name);
- }
+ if( func ){
+ xfree(name_a);
+ goto found;
}
+ name_n = xrealloc(name_a, len+6);
}
#else
+ name_n = (char*)xmalloc(len+6);
+#endif
+ memcpy(name_n, name, len);
+ name_n[len++] = '@';
for( i = 0; i < 256; i += 4 ){
- int len = strlen(name);
- char *name_n = (char*)xmalloc(len+4);
- sprintf(name_n, "%s@%d", name, i);
+ sprintf(name_n + len, "%d", i);
func = dlsym(handle, name_n);
- xfree(name_n);
CHECK_DLERROR;
- if( func ){
- break;
- }
+ if( func ) break;
}
- CHECK_DLERROR;
- if( !func ){
+ xfree(name_n);
+ if( func ) goto found;
+ name_n[len-1] = 'A';
+ name_n[len++] = '@';
+ for( i = 0; i < 256; i += 4 ){
+ sprintf(name_n + len, "%d", i);
+ func = dlsym(handle, name_n);
+ CHECK_DLERROR;
+ if( func ) break;
+ }
+ if( !func ){
rb_raise(rb_eDLError, "unknown symbol \"%s\"", name);
}
-#endif
}
+ found:
return PTR2NUM(func);
}