From: h.shirosaki@... Date: 2014-04-28T05:31:31+00:00 Subject: [ruby-core:62191] [ruby-trunk - Bug #9648] [Assigned] Dir.glob('../*') shows unexpected result in a symbolic linked directory on Windows Issue #9648 has been updated by Hiroshi Shirosaki. Status changed from Feedback to Assigned Assignee set to Nobuyoshi Nakada If current directory is C:\foo\bar (linked to V:\), `READDIR` of '.' (i.e. `FindFirstFile(".\\*", &d)`) globs linked directory (V:/), but the result doesn't have '..'. So we cannot trace parent directory. Skipping `READDIR` usage for this case solves the bug. ~~~patch diff --git a/dir.c b/dir.c index f456e8b..91a8495 100644 --- a/dir.c +++ b/dir.c @@ -1397,6 +1397,14 @@ glob_helper( if (exist == NO || isdir == NO) return 0; + if (!(magical || recursive) && (FNM_SYSCASE && plain)) { + /* READDIR will not return '..' at a directory which is symbolic linked to + a root directory on Windows. We don't use READDIR to get '..'. */ + struct glob_pattern *p = *beg; + if (p && strcmp(p->str, "..") == 0) + goto literally; + } + if (magical || recursive || ((FNM_SYSCASE || HAVE_HFS) && plain)) { struct dirent *dp; DIR *dirp; ~~~ ---------------------------------------- Bug #9648: Dir.glob('../*') shows unexpected result in a symbolic linked directory on Windows https://bugs.ruby-lang.org/issues/9648#change-46347 * Author: Hiroshi Shirosaki * Status: Assigned * Priority: Normal * Assignee: Nobuyoshi Nakada * Category: * Target version: * ruby -v: ruby 2.2.0dev (2014-03-17 trunk 45356) [x64-mingw32] * Backport: 2.0.0: DONTNEED, 2.1: DONTNEED ---------------------------------------- `Dir.glob('../*')` shows unexpected result if current directory is a symbolic linked directory on Windows. This issue seems to be introduced by r44802. The following is a test case. ~~~ C:\foo>mklink /D bar V:\ symbolic link created for bar <<===>> V:\ C:\foo>cd bar C:\foo\bar>ruby -ve "p Dir.glob('../*')" ruby 1.9.3p392 (2013-02-22) [i386-mingw32] ["../a", "../bar"] C:\foo\bar>\rubyinstaller\sandbox\ruby21_build\miniruby.exe -ve "p Dir.glob('../*')" ruby 2.2.0dev (2014-02-04 trunk 45356) [x64-mingw32] [] C:\foo\bar>dir .. Volume in drive C is OS Volume Serial Number is 6629-B36B Directory of C:\foo 2014/03/17 18:58