comparison src/os_mswin.c @ 16945:efd36a9052cc v8.1.1473

patch 8.1.1473: new resolve() implementation causes problem for plugins commit https://github.com/vim/vim/commit/4a792c87b9a643a949ee36106a2f7e971dc633f8 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Jun 6 12:22:41 2019 +0200 patch 8.1.1473: new resolve() implementation causes problem for plugins Problem: New resolve() implementation causes problem for plugins. Solution: Only resolve a resparse point after checking it is needed. (Ken Takata, closes #4492)
author Bram Moolenaar <Bram@vim.org>
date Thu, 06 Jun 2019 12:30:05 +0200
parents f42aa3d90b12
children a6f392cc9587
comparison
equal deleted inserted replaced
16944:d23afa4d8b63 16945:efd36a9052cc
1751 LPDWORD lpFileSystemFlags, 1751 LPDWORD lpFileSystemFlags,
1752 LPWSTR lpFileSystemNameBuffer, 1752 LPWSTR lpFileSystemNameBuffer,
1753 DWORD nFileSystemNameSize); 1753 DWORD nFileSystemNameSize);
1754 static pfnGetVolumeInformationByHandleW pGetVolumeInformationByHandleW = NULL; 1754 static pfnGetVolumeInformationByHandleW pGetVolumeInformationByHandleW = NULL;
1755 1755
1756 # define is_path_sep(c) ((c) == L'\\' || (c) == L'/')
1757
1758 static int
1759 is_reparse_point_included(LPCWSTR fname)
1760 {
1761 LPCWSTR p = fname, q;
1762 WCHAR buf[MAX_PATH];
1763 DWORD attr;
1764
1765 if (isalpha(p[0]) && p[1] == L':' && is_path_sep(p[2]))
1766 p += 3;
1767 else if (is_path_sep(p[0]) && is_path_sep(p[1]))
1768 p += 2;
1769
1770 while (*p != L'\0')
1771 {
1772 q = wcspbrk(p, L"\\/");
1773 if (q == NULL)
1774 p = q = fname + wcslen(fname);
1775 else
1776 p = q + 1;
1777 if (q - fname >= MAX_PATH)
1778 return FALSE;
1779 wcsncpy(buf, fname, q - fname);
1780 buf[q - fname] = L'\0';
1781 attr = GetFileAttributesW(buf);
1782 if (attr != INVALID_FILE_ATTRIBUTES
1783 && (attr & FILE_ATTRIBUTE_REPARSE_POINT) != 0)
1784 return TRUE;
1785 }
1786 return FALSE;
1787 }
1788
1756 static char_u * 1789 static char_u *
1757 resolve_reparse_point(char_u *fname) 1790 resolve_reparse_point(char_u *fname)
1758 { 1791 {
1759 HANDLE h = INVALID_HANDLE_VALUE; 1792 HANDLE h = INVALID_HANDLE_VALUE;
1760 DWORD size; 1793 DWORD size;
1784 } 1817 }
1785 1818
1786 p = enc_to_utf16(fname, NULL); 1819 p = enc_to_utf16(fname, NULL);
1787 if (p == NULL) 1820 if (p == NULL)
1788 goto fail; 1821 goto fail;
1822
1823 if (!is_reparse_point_included(p))
1824 {
1825 vim_free(p);
1826 goto fail;
1827 }
1789 1828
1790 h = CreateFileW(p, 0, 0, NULL, OPEN_EXISTING, 1829 h = CreateFileW(p, 0, 0, NULL, OPEN_EXISTING,
1791 FILE_FLAG_BACKUP_SEMANTICS, NULL); 1830 FILE_FLAG_BACKUP_SEMANTICS, NULL);
1792 vim_free(p); 1831 vim_free(p);
1793 1832