From: Yukihiro Matsumoto Date: 2008-04-16T14:27:12+09:00 Subject: [ruby-dev:34424] Re: tempfile.unlink 後に tempfile.close まつもと ゆきひろです In message "Re: [ruby-dev:34094] tempfile.unlink 後に tempfile.close" on Thu, 20 Mar 2008 15:47:56 +0900, SATOH Fumiyasu writes: |Tempfile オブジェクトを unlink した後に close すると、 |以下のように例外が発生してしまいます。 | |$ ruby -v |ruby 1.8.6 (2008-03-03 patchlevel 114) [x86_64-linux] |ちなみに Ruby 1.9.0-1 では発生しませんでした。 1.9では対応されてますね。以下のようなパッチが効くみたいです。 1.8.7に入れるかどうかはお任せします > knuさん。 diff --git a/ChangeLog b/ChangeLog index 9994dae..797d766 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Apr 16 14:22:42 2008 Yukihiro Matsumoto + + * lib/tempfile.rb (Tempfile::_close): check @data before modifying + it backported from 1.9. [ruby-dev:34094] + + * lib/tempfile.rb (Tempfile::close): clear @data and @tmpname. + Wed Apr 16 06:03:45 2008 Akinori MUSHA * test/ruby/test_settracefunc.rb (TestSetTraceFunc#test_event): diff --git a/lib/tempfile.rb b/lib/tempfile.rb index c728dbc..703e781 100644 --- a/lib/tempfile.rb +++ b/lib/tempfile.rb @@ -95,7 +95,8 @@ class Tempfile < DelegateClass(File) def _close # :nodoc: @tmpfile.close if @tmpfile - @data[1] = @tmpfile = nil + @tmpfile = nil + @data[1] = nil if @data end protected :_close @@ -117,6 +118,7 @@ class Tempfile < DelegateClass(File) _close @clean_proc.call ObjectSpace.undefine_finalizer(self) + @data = @tmpname = nil end # Unlinks the file. On UNIX-like systems, it is often a good idea