aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-04-20 06:04:28 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-04-20 06:04:28 +0000
commit596f081d680b4f6e861053e22ef8bae6a44c0eab (patch)
treee6062151138da969add439ea2c386ceaf821e0b8
parent325a50fc572516a171d640765d6ddf9b20be14dc (diff)
downloadruby-596f081d680b4f6e861053e22ef8bae6a44c0eab.tar.gz
* win32/win32.c (rb_w32_wreadlink): fixed a bug that a junktion misses
its drive letter. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50352 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--win32/win32.c15
2 files changed, 17 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 8a81b27f63..301a00d7b7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Apr 20 15:02:47 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_wreadlink): fixed a bug that a junktion misses
+ its drive letter.
+
Mon Apr 20 12:54:56 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
* ext/openssl/*: use license instead of licence.
diff --git a/win32/win32.c b/win32/win32.c
index 20b7dc5b2b..12593600e5 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4731,9 +4731,18 @@ rb_w32_wreadlink(const WCHAR *path, WCHAR *buf, size_t bufsize)
e = EINVAL;
}
else {
- void *name = ((char *)rp.SymbolicLinkReparseBuffer.PathBuffer +
- rp.SymbolicLinkReparseBuffer.PrintNameOffset);
- ret = rp.SymbolicLinkReparseBuffer.PrintNameLength;
+ void *name;
+ if (rp.ReparseTag == IO_REPARSE_TAG_SYMLINK) {
+ name = ((char *)rp.SymbolicLinkReparseBuffer.PathBuffer +
+ rp.SymbolicLinkReparseBuffer.PrintNameOffset);
+ ret = rp.SymbolicLinkReparseBuffer.PrintNameLength;
+ }
+ else { /* IO_REPARSE_TAG_MOUNT_POINT */
+ /* +4/-4 mean to drop "?\" */
+ name = ((char *)rp.SymbolicLinkReparseBuffer.PathBuffer +
+ rp.SymbolicLinkReparseBuffer.SubstituteNameOffset + 4);
+ ret = rp.SymbolicLinkReparseBuffer.SubstituteNameLength - 4;
+ }
((WCHAR *)name)[ret/sizeof(WCHAR)] = L'\0';
translate_wchar(name, L'\\', L'/');
bufsize *= sizeof(WCHAR);