Mercurial > vim
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 |