diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-10-13 09:32:16 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-10-13 09:32:16 +0000 |
commit | 5590d804cd18f2a12f7a09c05b070f048714cebc (patch) | |
tree | 936f54dabd8ecc2059b8ec31c52986478aee8dc1 | |
parent | 7bc061ce19cb7484e9fafb4462cdaba577109bbd (diff) |
block->tag pointing out of stack
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_4@542 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | eval.c | 13 |
2 files changed, 16 insertions, 3 deletions
@@ -1,5 +1,11 @@ Tue Oct 12 22:29:04 1999 Yukihiro Matsumoto <matz@netlab.co.jp> + * eval.c (block_pass): should copy block to prevent modifications. + tag in the structure should be updated from latest prot_tag. + + * eval.c (proc_s_new): tag in struct BLOCK should not point into + unused stack. + * io.c (io_read): length may be 0 or negative. Tue Oct 12 13:26:27 1999 Jun-ichiro itojun Hagino <itojun@itojun.org> @@ -5549,6 +5549,7 @@ proc_s_new(klass) data->orig_thread = rb_thread_current(); data->iter = data->prev?Qtrue:Qfalse; + data->tag = 0; /* should not point into stack */ frame_dup(&data->frame); if (data->iter) { blk_copy_prev(data); @@ -5589,6 +5590,7 @@ proc_call(proc, args) VALUE proc, args; /* OK */ { struct BLOCK * volatile old_block; + struct BLOCK _block; struct BLOCK *data; volatile VALUE result = Qnil; int state; @@ -5600,7 +5602,8 @@ proc_call(proc, args) /* PUSH BLOCK from data */ old_block = ruby_block; - ruby_block = data; + _block = *data; + ruby_block = &_block; PUSH_ITER(ITER_CUR); ruby_frame->iter = ITER_CUR; @@ -5625,6 +5628,7 @@ proc_call(proc, args) } PUSH_TAG(PROT_NONE); + _block.tag = prot_tag; state = EXEC_TAG(); if (state == 0) { proc_set_safe_level(proc); @@ -5690,6 +5694,7 @@ block_pass(self, node) { VALUE block = rb_eval(self, node->nd_body); struct BLOCK * volatile old_block; + struct BLOCK _block; struct BLOCK *data; volatile VALUE result = Qnil; int state; @@ -5712,11 +5717,13 @@ block_pass(self, node) /* PUSH BLOCK from data */ old_block = ruby_block; - ruby_block = data; + _block = *data; + ruby_block = &_block; PUSH_ITER(ITER_PRE); ruby_frame->iter = ITER_PRE; PUSH_TAG(PROT_NONE); + _block.tag = prot_tag; state = EXEC_TAG(); if (state == 0) { proc_set_safe_level(block); @@ -5724,7 +5731,7 @@ block_pass(self, node) } POP_TAG(); POP_ITER(); - if (ruby_block->tag->dst == state) { + if (_block.tag->dst == state) { state &= TAG_MASK; orphan = 2; } |