diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | win32/win32.c | 9 |
2 files changed, 10 insertions, 4 deletions
@@ -1,3 +1,8 @@ +Tue Sep 8 12:05:00 2015 NAKAMURA Usaku <usa@ruby-lang.org> + + * win32/win32.c (rb_w32_read_reparse_point): return correct required + buffer size for IO_REPARSE_TAG_MOUNT_POINT. + Tue Sep 8 00:14:43 2015 Nobuyoshi Nakada <nobu@ruby-lang.org> * process.c (rb_execarg_parent_start1): raise with the target path diff --git a/win32/win32.c b/win32/win32.c index 42ff582fef..d1cfb6bcf5 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -4777,7 +4777,7 @@ rb_w32_read_reparse_point(const WCHAR *path, rb_w32_reparse_buffer_t *rp, size_t bufsize, WCHAR **result, DWORD *len) { int e = reparse_symlink(path, rp, bufsize); - DWORD ret; + DWORD ret = 0; if (!e || e == ERROR_MORE_DATA) { void *name; @@ -4785,17 +4785,18 @@ rb_w32_read_reparse_point(const WCHAR *path, rb_w32_reparse_buffer_t *rp, name = ((char *)rp->SymbolicLinkReparseBuffer.PathBuffer + rp->SymbolicLinkReparseBuffer.PrintNameOffset); ret = rp->SymbolicLinkReparseBuffer.PrintNameLength; + *len = ret / sizeof(WCHAR); } else { /* IO_REPARSE_TAG_MOUNT_POINT */ /* +4/-4 means to drop "\??\" */ name = ((char *)rp->MountPointReparseBuffer.PathBuffer + rp->MountPointReparseBuffer.SubstituteNameOffset + 4 * sizeof(WCHAR)); - ret = rp->MountPointReparseBuffer.SubstituteNameLength - - 4 * sizeof(WCHAR); + ret = rp->MountPointReparseBuffer.SubstituteNameLength; + *len = ret / sizeof(WCHAR); + ret -= 4 * sizeof(WCHAR); } *result = name; - *len = ret / sizeof(WCHAR); if (e) { if ((char *)name + ret + sizeof(WCHAR) > (char *)rp + bufsize) return e; |