Issue #6010 has been updated by Akira Tanaka.

Status changed from Open to Closed
% Done changed from 0 to 100

Applied in changeset ruby-trunk:r45835.

----------
* lib/open-uri.rb (OpenURI.open_uri): Call StringIO#close only if
  the StringIO object is not closed yet.
  Reported by Jordi Massaguer Pla.  [ruby-core:42538] [Bug #6010]

----------------------------------------
Bug #6010: open-uri not checking if io is closed
https://bugs.ruby-lang.org/issues/6010#change-46551

* Author: Jordi Massaguer Pla
* Status: Closed
* Priority: Normal
* Assignee: 
* Category: lib
* Target version: Ruby 1.8.7
* ruby -v: ruby 1.8.7 (2011-12-28 patchlevel 357) [x86_64-linux]
----------------------------------------
Here is how to reproduce the bug:

The following code works:

open "http://rubygems.org/gems/curb-0.8.0.gem", "rb" do |io|
 Gem::Package.open io, 'r', nil do |pkg|
 end
end

The following code raises an exception:

open "http://rubygems.org/gems/factory_girl_rails-1.2.0.gem", "rb" do |io|
 Gem::Package.open io, 'r', nil do |pkg|
 end
end

IOError: closed stream
	from /usr/lib64/ruby/1.8/open-uri.rb:137:in `close'
	from /usr/lib64/ruby/1.8/open-uri.rb:137:in `open_uri'
	from /usr/lib64/ruby/1.8/open-uri.rb:518:in `open'
	from /usr/lib64/ruby/1.8/open-uri.rb:30:in `open'
	from (irb):74
	from :0

This is the patch that will make this work:

--- /usr/lib64/ruby/1.8/open-uri.rb	2012-02-06 12:30:39.173000026 +0100
+++ /usr/lib64/ruby/1.8/open-uri.rb.patched	2012-02-06 12:33:33.552000027 +0100
@@ -134,7 +134,7 @@
       begin
         yield io
       ensure
-        io.close 
+        io.close if io && !io.closed?
       end
     else
       io





-- 
https://bugs.ruby-lang.org/