diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-02-21 17:17:08 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-02-21 17:17:08 +0000 |
commit | 6d0b1d8a8691460189caee88bfbef2dd129b48bd (patch) | |
tree | be892e3518f0b5f0a0555cd9c996e62ccab5e5ba | |
parent | 10957cd1cc65dfa5c0c8d1f5d96caa8ac787467c (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-- | ChangeLog | 5 | ||||
-rw-r--r-- | file.c | 30 | ||||
-rw-r--r-- | test/ruby/test_file_exhaustive.rb | 21 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 53 insertions, 5 deletions
@@ -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 @@ -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)) @@ -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 |