summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--lib/drb/drb.rb24
-rw-r--r--test/drb/test_drb.rb9
3 files changed, 35 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index cb54629a10..eeb0a62dbf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon Apr 11 23:47:21 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 d40b6b3721..d97ed40419 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