From 48b19a3a759e85a7dfaad10f8b18e594447fbc36 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 3 Jul 2013 05:15:28 +0000 Subject: dir.c: get rid of FindFirstFile bug * dir.c (do_stat): use rb_w32_ustati64() in win32.c to get rid of mysterious behavior of FindFirstFile() Windows API which treat "<" and ">" like as wildcard characters. [ruby-core:55764] [Bug #8597] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41755 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ dir.c | 8 +++++++- test/ruby/test_dir.rb | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index f2785796c9..807c0d97e0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Jul 3 14:15:25 2013 Nobuyoshi Nakada + + * dir.c (do_stat): use rb_w32_ustati64() in win32.c to get rid of + mysterious behavior of FindFirstFile() Windows API which treat "<" + and ">" like as wildcard characters. [ruby-core:55764] [Bug #8597] + Wed Jul 3 12:06:42 2013 Tanaka Akira * bignum.c (maxpow_in_bdigit): Renamed from calc_hbase and return diff --git a/dir.c b/dir.c index 75c5f5f754..f28569acd2 100644 --- a/dir.c +++ b/dir.c @@ -1029,12 +1029,18 @@ sys_warning_1(VALUE mesg) */ #define to_be_ignored(e) ((e) == ENOENT || (e) == ENOTDIR) +#ifdef _WIN32 +#define STAT(p, s) rb_w32_ustati64((p), (s)) +#else +#define STAT(p, s) stat((p), (s)) +#endif + /* System call with warning */ static int do_stat(const char *path, struct stat *pst, int flags) { - int ret = stat(path, pst); + int ret = STAT(path, pst); if (ret < 0 && !to_be_ignored(errno)) sys_warning(path); diff --git a/test/ruby/test_dir.rb b/test/ruby/test_dir.rb index b3630bf033..d8e94727cd 100644 --- a/test/ruby/test_dir.rb +++ b/test/ruby/test_dir.rb @@ -213,4 +213,8 @@ class TestDir < Test::Unit::TestCase Dir.glob(File.join(@root, "**/")) end + def test_glob_metachar + bug8597 = '[ruby-core:55764] [Bug #8597]' + assert_empty(Dir.glob(File.join(@root, "<")), bug8597) + end end -- cgit v1.2.3