From 499ca89e24c47cfada7e493a7dfd81cdb9323a45 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 29 Jan 2013 07:51:00 +0000 Subject: vm_trace.c: TracePoint safe level check * vm_trace.c (rb_tracepoint_enable, rb_tracepoint_disable): check safe level as well as set_trace_func. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38969 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 ++++- test/ruby/test_settracefunc.rb | 14 ++++++++++++++ vm_trace.c | 10 ++++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1cd67e0ec0..8bc8fa3ae9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,7 @@ -Tue Jan 29 16:50:25 2013 Nobuyoshi Nakada +Tue Jan 29 16:50:58 2013 Nobuyoshi Nakada + + * vm_trace.c (rb_tracepoint_enable, rb_tracepoint_disable): check safe + level as well as set_trace_func. * vm_trace.c (set_trace_func, thread_{add,set}_trace_func_m): check safe level as well as 1.8. diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb index 264b805127..e7c010aaaf 100644 --- a/test/ruby/test_settracefunc.rb +++ b/test/ruby/test_settracefunc.rb @@ -919,4 +919,18 @@ class TestSetTraceFunc < Test::Unit::TestCase assert_equal([:b_call, :b_return], ary, bug_7668) end end + + def test_trace_point_enable_safe4 + tp = TracePoint.new {} + assert_security_error_safe4 do + tp.enable + end + end + + def test_trace_point_disable_safe4 + tp = TracePoint.new {} + assert_security_error_safe4 do + tp.disable + end + end end diff --git a/vm_trace.c b/vm_trace.c index 36fa2327ea..dd68715693 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -943,7 +943,10 @@ tp_call_trace(VALUE tpval, rb_trace_arg_t *trace_arg) VALUE rb_tracepoint_enable(VALUE tpval) { - rb_tp_t *tp = tpptr(tpval); + rb_tp_t *tp; + + rb_secure(4); + tp = tpptr(tpval); if (tp->target_th) { rb_thread_add_event_hook2(tp->target_th->self, (rb_event_hook_func_t)tp_call_trace, tp->events, tpval, @@ -960,7 +963,10 @@ rb_tracepoint_enable(VALUE tpval) VALUE rb_tracepoint_disable(VALUE tpval) { - rb_tp_t *tp = tpptr(tpval); + rb_tp_t *tp; + + rb_secure(4); + tp = tpptr(tpval); if (tp->target_th) { rb_thread_remove_event_hook_with_data(tp->target_th->self, (rb_event_hook_func_t)tp_call_trace, tpval); -- cgit v1.2.3