1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

file.c: fix handle leak

* 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/trunk@49664 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2015-02-20 08:27:14 +00:00
parent b386332792
commit 471457733e
3 changed files with 35 additions and 2 deletions

View file

@ -1,3 +1,8 @@
Fri Feb 20 17:27:12 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.
Fri Feb 20 17:19:23 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* win32/win32.c (different_device_p): compare by volume serial

30
file.c
View file

@ -1053,6 +1053,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
/*
@ -1916,8 +1935,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);

View file

@ -311,6 +311,8 @@ class TestFileExhaustive < Test::Unit::TestCase
assert_raise(IOError) {
File.identical?(@file, io)
}
File.unlink(@file)
assert_file.not_exist?(@file)
end
def test_s_size