summaryrefslogtreecommitdiff
path: root/dln.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-01 04:30:26 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-01 04:30:26 +0000
commitf2604ef5126b664f988b5866c639fcfcc18f778c (patch)
treefd2cded55eedc499501e4fdcaf0ba97452411c4e /dln.c
parent2d3a0fa61b6163805f1b2f6c02628115842ea7c5 (diff)
dln.c: check incompatible libruby
* dln.c (dln_load): check if a different libruby is loaded by the extension library, and then bail out to get rid of very frequent reported stale bug reports. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50412 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'dln.c')
-rw-r--r--dln.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/dln.c b/dln.c
index aa1e622..b0ac56e 100644
--- a/dln.c
+++ b/dln.c
@@ -1324,6 +1324,21 @@ dln_load(const char *file)
error = dln_strerror();
goto failed;
}
+# if defined RUBY_EXPORT
+ {
+ static const char incompatible[] = "incompatible library version";
+ void *ex = dlsym(handle, EXPORT_PREFIX"ruby_xmalloc");
+ if (ex && ex != ruby_xmalloc) {
+
+# if !defined __APPLE__
+ /* dlclose() segfaults */
+ dlclose(handle);
+# endif
+ error = incompatible;
+ goto failed;
+ }
+ }
+# endif
init_fct = (void(*)())(VALUE)dlsym(handle, buf);
if (init_fct == NULL) {