aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--vm_insnhelper.c5
2 files changed, 8 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index f677aa3c06..82d7f47106 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Nov 28 22:54:21 2012 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_call_method): fix undefined behavior.
+ Should not access scope local variable from outer scope.
+
Wed Nov 28 22:20:55 2012 Masaya Tarui <tarui@ruby-lang.org>
* test/ruby/test_thread.rb (test_thread_status_in_trap): change test for
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 89cc0f2394..ab4fb38732 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1698,6 +1698,7 @@ static inline VALUE
vm_call_method(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
{
int enable_fastpath = 1;
+ rb_call_info_t ci_temp;
start_method_dispatch:
if (ci->me != 0) {
@@ -1735,8 +1736,8 @@ vm_call_method(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
}
case VM_METHOD_TYPE_ZSUPER:{
VALUE klass = RCLASS_SUPER(ci->me->klass);
- rb_call_info_t cie = *ci;
- ci = &cie;
+ ci_temp = *ci;
+ ci = &ci_temp;
ci->me = rb_method_entry(klass, ci->mid, &ci->defined_class);