mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
block->tag pointing out of stack
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@542 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ec8a9bba35
commit
826f10c6ce
2 changed files with 16 additions and 3 deletions
|
@ -1,5 +1,11 @@
|
|||
Wed Oct 13 02:17:05 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.
|
||||
|
||||
* dir.c (dir_s_glob): iterate over generated matching filenames if
|
||||
the block is given to the method.
|
||||
|
||||
|
|
13
eval.c
13
eval.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue