diff options
author | seki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-11 14:48:50 +0000 |
---|---|---|
committer | seki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-11 14:48:50 +0000 |
commit | d822ffdc04e125d19daeeef71bc100377cf54e0b (patch) | |
tree | 5461c4b1c25c72930566f4d0d0800383bac482c9 | |
parent | 4f6e8bade5afe7d71ea6db73089f7634124aeec3 (diff) | |
download | ruby-d822ffdc04e125d19daeeef71bc100377cf54e0b.tar.gz |
adhoc patch for [druby-ja:123]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8305 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-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 |