summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-03-08 13:52:51 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-03-08 13:52:51 +0000
commitb6d5ce7975667cc32d7d86a992d5206627e5ff73 (patch)
tree1802023dc4f9a29204373e917d10d24d4b68d186
parent5b06e833453dcbbf4da69a5f98d50e565d4300ef (diff)
* ext/zlib/zlib.c (rb_gzfile_close): Don't raise on double
close for consistent to IO#close. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49893 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--ext/zlib/zlib.c6
-rw-r--r--test/zlib/test_zlib.rb22
3 files changed, 32 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 5e7790783a..d45f02545c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Mar 8 22:50:57 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/zlib/zlib.c (rb_gzfile_close): Don't raise on double
+ close for consistent to IO#close.
+
Sun Mar 8 16:57:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* dir.c (glob_helper): match patterns against legacy short names
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index 8f24b77d8f..9c2b7b624f 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -3297,9 +3297,13 @@ rb_gzfile_set_comment(VALUE obj, VALUE str)
static VALUE
rb_gzfile_close(VALUE obj)
{
- struct gzfile *gz = get_gzfile(obj);
+ struct gzfile *gz;
VALUE io;
+ TypedData_Get_Struct(obj, struct gzfile, &gzfile_data_type, gz);
+ if (!ZSTREAM_IS_READY(&gz->z)) {
+ return Qnil;
+ }
io = gz->io;
gzfile_close(gz, 1);
return io;
diff --git a/test/zlib/test_zlib.rb b/test/zlib/test_zlib.rb
index 3a2fe9274d..63bbd27cc6 100644
--- a/test/zlib/test_zlib.rb
+++ b/test/zlib/test_zlib.rb
@@ -962,6 +962,19 @@ if defined? Zlib
assert_equal(content, read_size)
}
end
+
+ def test_double_close
+ Tempfile.create("test_zlib_gzip_reader_close") {|t|
+ t.binmode
+ content = "foo"
+ Zlib::GzipWriter.wrap(t) {|gz| gz.print(content) }
+ r = Zlib::GzipReader.open(t.path)
+ assert_equal(content, r.read)
+ assert_nothing_raised { r.close }
+ assert_nothing_raised { r.close }
+ }
+ end
+
end
class TestZlibGzipWriter < Test::Unit::TestCase
@@ -1022,6 +1035,15 @@ if defined? Zlib
assert_equal("foo", Zlib::GzipReader.open(t.path) {|gz| gz.read })
}
end
+
+ def test_double_close
+ Tempfile.create("test_zlib_gzip_reader_close") {|t|
+ t.binmode
+ w = Zlib::GzipWriter.wrap(t)
+ assert_nothing_raised { w.close }
+ assert_nothing_raised { w.close }
+ }
+ end
end
class TestZlib < Test::Unit::TestCase