Revision: 4318 http://trac.macosforge.org/projects/ruby/changeset/4318 Author: lsansonetti@apple.com Date: 2010-07-06 15:27:21 -0700 (Tue, 06 Jul 2010) Log Message: ----------- reduce/restore safe level when formatting an exception (since it may taint objects) Modified Paths: -------------- MacRuby/trunk/error.c Modified: MacRuby/trunk/error.c =================================================================== --- MacRuby/trunk/error.c 2010-07-04 12:32:27 UTC (rev 4317) +++ MacRuby/trunk/error.c 2010-07-06 22:27:21 UTC (rev 4318) @@ -1214,14 +1214,13 @@ if (OBJ_FROZEN(obj)) rb_error_frozen(rb_obj_classname(obj)); } -VALUE -rb_format_exception_message(VALUE exc) +static VALUE +format_message(VALUE exc) { + CFMutableStringRef result = CFStringCreateMutable(NULL, 0); VALUE message = rb_vm_call(exc, sel_registerName("message"), 0, NULL); VALUE bt = rb_vm_call(exc, sel_registerName("backtrace"), 0, NULL); - CFMutableStringRef result = CFStringCreateMutable(NULL, 0); - const long count = (bt != Qnil ? RARRAY_LEN(bt) : 0); if (count > 0) { for (long i = 0; i < count; i++) { @@ -1239,11 +1238,26 @@ CFStringAppendFormat(result, NULL, CFSTR("%s (%s)\n"), RSTRING_PTR(message), rb_class2name(*(VALUE *)exc)); } - CFMakeCollectable(result); return (VALUE)result; } +static VALUE +restore_level(VALUE lvl) +{ + rb_set_safe_level_force((int)lvl); + return Qnil; +} + +VALUE +rb_format_exception_message(VALUE exc) +{ + const int old_level = rb_safe_level(); + rb_set_safe_level_force(0); + + return rb_ensure(format_message, exc, restore_level, (VALUE)old_level); +} + void Init_syserr(void) {