summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-02-21 17:17:08 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-02-21 17:17:08 +0000
commit6d0b1d8a8691460189caee88bfbef2dd129b48bd (patch)
treebe892e3518f0b5f0a0555cd9c996e62ccab5e5ba
parent10957cd1cc65dfa5c0c8d1f5d96caa8ac787467c (diff)
merge revision(s) 49661,49662,49664:
test_file_exhaustive.rb: remove useless assignment * test/ruby/test_file_exhaustive.rb (make_tmp_filename): not assign to instance variable, @hardlinkfile. * file.c (rb_file_identical_p): fix handle leak, ensure to close the handle of the first argument. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@49677 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--file.c30
-rw-r--r--test/ruby/test_file_exhaustive.rb21
-rw-r--r--version.h2
4 files changed, 53 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 1a213d717c..f5bc967cc7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Feb 22 02:16:40 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_identical_p): fix handle leak, ensure to close
+ the handle of the first argument.
+
Sat Feb 21 13:48:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* win32/win32.c (different_device_p): compare by volume serial
diff --git a/file.c b/file.c
index 9539ea937a..37315060e9 100644
--- a/file.c
+++ b/file.c
@@ -1052,6 +1052,25 @@ w32_io_info(VALUE *file, BY_HANDLE_FILE_INFORMATION *st)
if (ret) CloseHandle(ret);
return INVALID_HANDLE_VALUE;
}
+
+static VALUE
+close_handle(VALUE h)
+{
+ CloseHandle((HANDLE)h);
+ return Qfalse;
+}
+
+struct w32_io_info_args {
+ VALUE *fname;
+ BY_HANDLE_FILE_INFORMATION *st;
+};
+
+static VALUE
+call_w32_io_info(VALUE arg)
+{
+ struct w32_io_info_args *p = (void *)arg;
+ return (VALUE)w32_io_info(p->fname, p->st);
+}
#endif
/*
@@ -1915,8 +1934,15 @@ rb_file_identical_p(VALUE obj, VALUE fname1, VALUE fname2)
# ifdef _WIN32
f1 = w32_io_info(&fname1, &st1);
if (f1 == INVALID_HANDLE_VALUE) return Qfalse;
- f2 = w32_io_info(&fname2, &st2);
- if (f1) CloseHandle(f1);
+ if (f1) {
+ struct w32_io_info_args arg;
+ arg.fname = &fname2;
+ arg.st = &st2;
+ f2 = (HANDLE)rb_ensure(call_w32_io_info, (VALUE)&arg, close_handle, (VALUE)f1);
+ }
+ else {
+ f2 = w32_io_info(&fname2, &st2);
+ }
if (f2 == INVALID_HANDLE_VALUE) return Qfalse;
if (f2) CloseHandle(f2);
diff --git a/test/ruby/test_file_exhaustive.rb b/test/ruby/test_file_exhaustive.rb
index 0c16a01453..b347e53d16 100644
--- a/test/ruby/test_file_exhaustive.rb
+++ b/test/ruby/test_file_exhaustive.rb
@@ -46,7 +46,7 @@ class TestFileExhaustive < Test::Unit::TestCase
end
def make_tmp_filename(prefix)
- @hardlinkfile = @dir + "/" + prefix + File.basename(__FILE__) + ".#{$$}.test"
+ "#{@dir}/#{prefix}#{File.basename(__FILE__)}.#{$$}.test"
end
def test_path
@@ -291,13 +291,30 @@ class TestFileExhaustive < Test::Unit::TestCase
assert_file.not_sticky?(@file)
end
- def test_identical_p
+ def test_path_identical_p
assert_file.identical?(@file, @file)
assert_file.not_identical?(@file, @zerofile)
assert_file.not_identical?(@file, @nofile)
assert_file.not_identical?(@nofile, @file)
end
+ def test_io_identical_p
+ open(@file) {|f|
+ assert_file.identical?(f, f)
+ assert_file.identical?(@file, f)
+ assert_file.identical?(f, @file)
+ }
+ end
+
+ def test_closed_io_identical_p
+ io = open(@file) {|f| f}
+ assert_raise(IOError) {
+ File.identical?(@file, io)
+ }
+ File.unlink(@file)
+ assert_file.not_exist?(@file)
+ end
+
def test_s_size
assert_integer(File.size(@dir))
assert_equal(3, File.size(@file))
diff --git a/version.h b/version.h
index cdeba15a3f..1d8bb3055a 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.2.0"
#define RUBY_RELEASE_DATE "2015-02-22"
-#define RUBY_PATCHLEVEL 74
+#define RUBY_PATCHLEVEL 75
#define RUBY_RELEASE_YEAR 2015
#define RUBY_RELEASE_MONTH 2