diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | lib/drb/drb.rb | 24 | ||||
-rw-r--r-- | test/drb/test_drb.rb | 9 |
3 files changed, 35 insertions, 5 deletions
@@ -1,3 +1,10 @@ +Mon Apr 11 23:36:04 2005 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp> + + * lib/drb/drb.r: [druby-ja:123] fix: When reference of my object is + loaded, the object is tainted. + + * test/drb/test_drb.rb: ditto. + Mon Apr 11 22:18:23 2005 WATANABE Hirofumi <eban@ruby-lang.org> * dir.c, file.c (lstat): avoid warnings for mingw. diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb index 08deb18b94..13cc360d34 100644 --- a/lib/drb/drb.rb +++ b/lib/drb/drb.rb @@ -575,10 +575,19 @@ module DRb end raise(DRbConnError, 'connection closed') if str.nil? raise(DRbConnError, 'premature marshal format(can\'t read)') if str.size < sz - begin - Marshal::load(str) - rescue NameError, ArgumentError - DRbUnknown.new($!, str) + Thread.exclusive do + begin + save = Thread.current[:drb_untaint] + Thread.current[:drb_untaint] = [] + Marshal::load(str) + rescue NameError, ArgumentError + DRbUnknown.new($!, str) + ensure + Thread.current[:drb_untaint].each do |x| + x.untaint + end + Thread.current[:drb_untaint] = save + end end end @@ -988,8 +997,13 @@ module DRb # created to act as a stub for the remote referenced object. def self._load(s) uri, ref = Marshal.load(s) + if DRb.here?(uri) - return DRb.to_obj(ref) + obj = DRb.to_obj(ref) + if ((! obj.tainted?) && Thread.current[:drb_untaint]) + Thread.current[:drb_untaint].push(obj) + end + return obj end self.new_with(uri, ref) diff --git a/test/drb/test_drb.rb b/test/drb/test_drb.rb index 468c97017d..5719f60b80 100644 --- a/test/drb/test_drb.rb +++ b/test/drb/test_drb.rb @@ -102,6 +102,15 @@ class TestDRbYield < Test::Unit::TestCase @there.xarray_each {|x| assert_kind_of(XArray, x)} @there.xarray_each {|*x| assert_kind_of(XArray, x[0])} end + + def test_06_taint + x = proc {} + assert(! x.tainted?) + @there.echo_yield(x) {|o| + assert_equal(x, o) + assert(! x.tainted?) + } + end end class TestRubyYield < TestDRbYield |