summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--ext/dl/cfunc.c2
2 files changed, 9 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index bb966a03f9..b4831f6daa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Jun 24 22:04:02 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * ext/dl/cfunc.c (rb_dlcfunc_call): fix conversion from Bignum to
+ pointer. sizeof(DLSTACK_TYPE) is larger than sizeof(long) on
+ Windows x64 and higher bits over sizeof(long) of DLSTACK_TYPE was
+ zero even if a pointer value was over 32 bits which causes SEGV on
+ DL::TestCPtr#test_to_ptr_io. Adding a cast solves the bug.
+
Mon Jun 24 22:04:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
* eval_error.c (warn_printf): use rb_vsprintf instead so ruby specific
diff --git a/ext/dl/cfunc.c b/ext/dl/cfunc.c
index 076f71ae25..46a26be7b8 100644
--- a/ext/dl/cfunc.c
+++ b/ext/dl/cfunc.c
@@ -372,7 +372,7 @@ rb_dlcfunc_call(VALUE self, VALUE ary)
rb_big_pack(arg, ls, sizeof(ls)/sizeof(*ls));
d = 0;
for (j = 0; j < (int)(sizeof(ls)/sizeof(*ls)); j++)
- d |= ls[j] << (j * sizeof(long) * CHAR_BIT);
+ d |= (DLSTACK_TYPE)ls[j] << (j * sizeof(long) * CHAR_BIT);
stack[i] = d;
}
else {