summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-01-21 07:43:41 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-01-21 07:43:41 +0000
commit4c2c8f099c305476c0361937c12f59fd5bfbc788 (patch)
treeaa9e156cbc680ee49ba0fa1bf9bd15d41676e7c9 /eval.c
parent551de15b61b773c3460e6b574df4ef4f7dc09807 (diff)
* eval.c (ruby_stop): should not trace error handler.
* io.c (io_write): should not raise exception on O_NONBLOCK io. * dir.c (dir_set_pos): seek should return dir, pos= should not. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@2008 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/eval.c b/eval.c
index a12d7ff3fe..9a0df065a2 100644
--- a/eval.c
+++ b/eval.c
@@ -1166,6 +1166,8 @@ ruby_stop(ex)
POP_ITER();
POP_TAG();
+ trace_func = 0;
+ tracing = 0;
ex = error_handle(ex);
ruby_finalize();
exit(ex);
@@ -6269,22 +6271,30 @@ proc_save_safe_level(data)
}
}
-static void
-proc_set_safe_level(data)
+static int
+proc_get_safe_level(data)
VALUE data;
{
if (OBJ_TAINTED(data)) {
switch (RBASIC(data)->flags & PROC_TMASK) {
case PROC_T3:
- ruby_safe_level = 3;
- break;
+ return 3;
case PROC_T4:
- ruby_safe_level = 4;
- break;
+ return 4;
case PROC_TMAX:
- ruby_safe_level = 5;
- break;
+ return 5;
}
+ return 3;
+ }
+ return 0;
+}
+
+static void
+proc_set_safe_level(data)
+ VALUE data;
+{
+ if (OBJ_TAINTED(data)) {
+ ruby_safe_level = proc_get_safe_level(data);
}
}
@@ -6528,7 +6538,9 @@ block_pass(self, node)
}
if (rb_safe_level() >= 1 && OBJ_TAINTED(block)) {
- rb_raise(rb_eSecurityError, "Insecure: tainted block value");
+ if (rb_safe_level() > proc_get_safe_level(block)) {
+ rb_raise(rb_eSecurityError, "Insecure: tainted block value");
+ }
}
Data_Get_Struct(block, struct BLOCK, data);