summaryrefslogtreecommitdiff
path: root/win32/win32.c
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 /win32/win32.c
parent325a50fc572516a171d640765d6ddf9b20be14dc (diff)
* 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
Diffstat (limited to 'win32/win32.c')
-rw-r--r--win32/win32.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/win32/win32.c b/win32/win32.c
index 20b7dc5..1259360 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);