summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);