From 691abdae8231e6978dd1644e3e6c02e733941b1b Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 26 Aug 2015 16:22:56 +0000 Subject: win32.c: ELOOP at wrename * win32/win32.c (wrename): fail with ELOOP if failed to resolve the old path name. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51697 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- win32/win32.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'win32') diff --git a/win32/win32.c b/win32/win32.c index 8d1a10026d..c9d3522d83 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -5009,6 +5009,18 @@ wrename(const WCHAR *oldpath, const WCHAR *newpath) errno = map_errno(GetLastError()); return -1; } + if (oldatts & FILE_ATTRIBUTE_REPARSE_POINT) { + HANDLE fh = CreateFileW(oldpath, 0, 0, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL); + if (fh == INVALID_HANDLE_VALUE) { + int e = GetLastError(); + if (e == ERROR_CANT_RESOLVE_FILENAME) { + errno = ELOOP; + return -1; + } + } + CloseHandle(fh); + } RUBY_CRITICAL({ if (newatts != -1 && newatts & FILE_ATTRIBUTE_READONLY) -- cgit v1.2.3