summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/dl/handle.c3
-rw-r--r--ext/dl/ptr.c4
-rw-r--r--ext/dl/sym.c2
3 files changed, 9 insertions, 0 deletions
diff --git a/ext/dl/handle.c b/ext/dl/handle.c
index 0ba43970103..4b0a129793d 100644
--- a/ext/dl/handle.c
+++ b/ext/dl/handle.c
@@ -75,6 +75,9 @@ rb_dlhandle_initialize(int argc, VALUE argv[], VALUE self)
};
#endif
Data_Get_Struct(self, struct dl_handle, dlhandle);
+ if( dlhandle->ptr && dlhandle->open && dlhandle->enable_close ){
+ dlclose(dlhandle->ptr);
+ }
dlhandle->ptr = ptr;
dlhandle->open = 1;
dlhandle->enable_close = 0;
diff --git a/ext/dl/ptr.c b/ext/dl/ptr.c
index 1a31861c8f6..149f33e4e54 100644
--- a/ext/dl/ptr.c
+++ b/ext/dl/ptr.c
@@ -202,6 +202,10 @@ rb_dlptr_initialize(int argc, VALUE argv[], VALUE self)
if( p ){
Data_Get_Struct(self, struct ptr_data, data);
+ if( data->ptr && data->free ){
+ /* Free previous memory. Use of inappropriate initialize may cause SEGV. */
+ (*(data->free))(data->ptr);
+ }
data->ptr = p;
data->size = s;
data->free = f;
diff --git a/ext/dl/sym.c b/ext/dl/sym.c
index 7e269b7c9ef..7531c7969f4 100644
--- a/ext/dl/sym.c
+++ b/ext/dl/sym.c
@@ -158,6 +158,8 @@ rb_dlsym_initialize(int argc, VALUE argv[], VALUE self)
if( saddr ){
Data_Get_Struct(self, struct sym_data, data);
+ if( data->name ) free(data->name);
+ if( data->type ) free(data->type);
data->func = saddr;
data->name = sname ? strdup(sname) : 0;
data->type = stype ? strdup(stype) : 0;