Project

General

Profile

Actions

Bug #6851

closed

Result of File.stat("c:/...") is different from 1.9.3

Added by phasis68 (Heesob Park) almost 10 years ago. Updated almost 10 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
Backport:
[ruby-core:47103]

Description

What is the correct result of File.stat("c:/...") on Windows?

File#stat for path like "c:/..." succeeds on trunk 36676.

C:>ruby -ve 'p File.stat("c:/...")'
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-10 14:53:27 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

C:>ruby -ve 'p File.stat("c:/....")'
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-10 14:53:32 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

C:>ruby -ve 'p File.stat("c:/..../..")'
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-10 14:53:45 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

But, File#stat raises exception on Ruby 1.9.3.

C:\Ruby193\bin>ruby -ve 'p File.stat("c:/...")
ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32]
-e:1:in stat': Invalid argument - c:/... (Errno::EINVAL) from -e:1:in '

C:\Ruby193\bin>ruby -ve 'p File.stat("c:/....")
ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32]
-e:1:in stat': No such file or directory - c:/.... (Errno::ENOENT) from -e:1:in '

Updated by usa (Usaku NAKAMURA) almost 10 years ago

  • Category set to core
  • Status changed from Open to Assigned
  • Assignee set to h.shirosaki (Hiroshi Shirosaki)
  • Target version set to 2.0.0

It's bug.

Updated by h.shirosaki (Hiroshi Shirosaki) almost 10 years ago

The behavior is same (not raises exception) as before r36668.

C:>ruby -ve "p File.stat('C:/...')"
ruby 2.0.0dev (2012-08-08 trunk 36657) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=1970-01-01 09:00:00 +0900, mtime=1970-01-01 09
:00:00 +0900, ctime=1970-01-01 09:00:00 +0900>

C:>ruby -ve "p File.stat('C:/....')"
ruby 2.0.0dev (2012-08-08 trunk 36657) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=1970-01-01 09:00:00 +0900, mtime=1970-01-01 09
:00:00 +0900, ctime=1970-01-01 09:00:00 +0900>

That seems due to r34205 and r34216.
Revert will solve this issue, but #5819 is not solved on the following corner case.
I think revert might be better. What do you think?

x:\ is empty drive. (ramdisk)

this case is ok

C:>miniruby -I. -e "p File.stat('x:/')"
#<File::Stat dev=0x17, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x17, size=0, blksize=nil, bl
ocks=nil, atime=2012-08-10 19:48:37 +0900, mtime=2012-08-10 19:48:37 +0900, ctime=2012-08-10 19:48:3
7 +0900>

but this case fails

C:>miniruby -I. -e "p File.stat('x:/.../..')"
-e:1:in stat': No such file or directory - x:/.../.. (Errno::ENOENT) from -e:1:in '

diff --git a/win32/win32.c b/win32/win32.c
index de655df..11f20ba 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4562,15 +4562,6 @@ check_valid_dir(const WCHAR *path)
if (wcsstr(path, L"...") == NULL)
return 0;

  • /* if the specified path is the root of a drive and the drive is empty, */
  • /* FindFirstFile() returns INVALID_HANDLE_VALUE. */
  • if (!GetFullPathNameW(path, sizeof(full) / sizeof(WCHAR), full, &dmy)) {
  • errno = map_errno(GetLastError());
  • return -1;
  • }
  • if (full[1] == L':' && !full[3] && GetDriveTypeW(full) != DRIVE_NO_ROOT_DIR)
  • return 0;
  • fh = open_dir_handle(path, &fd);
    if (fh == INVALID_HANDLE_VALUE)
    return -1;

Updated by luislavena (Luis Lavena) almost 10 years ago

  • Status changed from Assigned to Feedback
  • Assignee changed from h.shirosaki (Hiroshi Shirosaki) to usa (Usaku NAKAMURA)

=begin
h.shirosaki (Hiroshi Shirosaki) wrote:

The behavior is same (not raises exception) as before r36668.

I can confirm File.stat('C:/...') did not raised exception even before Hiroshi's change.

C:\Users\Luis>ruby -v -e "p File.stat('C:/...')"
ruby 2.0.0dev (2012-08-07 trunk 36647) [i386-mingw32]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=0, blksize=nil, blocks=nil, atime=1969-12-31 21:00:00 -0300, mtime=1969-12-31 21:00:00 -0300, ctime=1969-12-31 21:00:00 -0300>

The changes to use (({GetFileAttributesExW})) are not the cause.

Since this was introduced in r34205 and r34216, perhaps Usa can better describe (({...})) behavior.

Reassigning for feedback.
=end

Updated by usa (Usaku NAKAMURA) almost 10 years ago

  • Status changed from Feedback to Assigned

Oops...

[Bug #5819] said that File.stat for empty root directory fails.
Of course it was a bug.
"C:/..." problem is an unexpected side effect.

Actions #5

Updated by usa (Usaku NAKAMURA) almost 10 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r36696.
Heesob, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • win32/win32.c (check_valid_dir): reject "..." as directory name.
    [Bug #6851]

Updated by usa (Usaku NAKAMURA) almost 10 years ago

Hopefully, fixed.

I added some test cases.
Please point out, if I have an oversight.

Updated by phasis68 (Heesob Park) almost 10 years ago

Hi,

2012/8/14 usa (Usaku NAKAMURA)

Issue #6851 has been updated by usa (Usaku NAKAMURA).

Hopefully, fixed.

I added some test cases.
Please point out, if I have an oversight.


Bug #6851: Result of File.stat("c:/...") is different from 1.9.3
https://bugs.ruby-lang.org/issues/6851#change-28859

Author: phasis68 (Heesob Park)
Status: Closed
Priority: Normal
Assignee: usa (Usaku NAKAMURA)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]

What is the correct result of File.stat("c:/...") on Windows?

File#stat for path like "c:/..." succeeds on trunk 36676.

C:>ruby -ve 'p File.stat("c:/...")'
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-10 14:53:27 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

C:>ruby -ve 'p File.stat("c:/....")'
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-10 14:53:32 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

C:>ruby -ve 'p File.stat("c:/..../..")'
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-10 14:53:45 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

But, File#stat raises exception on Ruby 1.9.3.

C:\Ruby193\bin>ruby -ve 'p File.stat("c:/...")
ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32]
-e:1:in stat': Invalid argument - c:/... (Errno::EINVAL) from -e:1:in '

C:\Ruby193\bin>ruby -ve 'p File.stat("c:/....")
ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32]
-e:1:in stat': No such file or directory - c:/.... (Errno::ENOENT) from -e:1:in '

I confirmed the bug is fixed.

I found another odd behavior of File#stat.

File#stat of some directory + ".." always works on Windows even if the
directory is not exists.

C:\work>ruby -e 'p File.stat("./notexist")'
-e:1:in stat': No such file or directory - ./notexist (Errno::ENOENT) from -e:1:in '

C:\work>ruby -e 'p File.stat("./notexist/..")'
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-14 16:44:54 +0900, mtime=2012-08-13 19
:28:30 +0900, ctime=2011-06-07 16:06:03 +0900>

C:\work>ruby -e 'p File.stat("../notexist")'
-e:1:in stat': No such file or directory - ../notexist (Errno::ENOENT) from -e:1:in '

C:\work>ruby -e 'p File.stat("../notexist/..")'
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-14 16:45:37 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

Here is Linux behavior.

[tmp]$ ruby -ve 'File.stat("./notexist")'
ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux]
-e:1:in stat': No such file or directory - ./notexist (Errno::ENOENT) from -e:1 [tmp]$ ruby -ve 'File.stat("./notexist/..")' ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux] -e:1:in stat': No such file or directory - ./notexist/.. (Errno::ENOENT)
from -e:1

Is this a bug or feature?

Regards,
Park Heesob

Updated by usa (Usaku NAKAMURA) almost 10 years ago

Is this a bug or feature?

It's a bug, but...
Does anyone challenge to fix this? :)

Actions

Also available in: Atom PDF