From 67d2619463061beafe86a773310962365380577f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 21 Feb 2021 13:12:03 +0900 Subject: Expand final path name buffer for namespace prefix As final path name includes the namespace prefix, so expand room for it in path name buffer. --- win32/win32.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'win32/win32.c') diff --git a/win32/win32.c b/win32/win32.c index 8f99805a5d..03e5f1392a 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -1989,12 +1989,16 @@ open_special(const WCHAR *path, DWORD access, DWORD flags) #define BitOfIsRep(n) ((n) * 2 + 1) #define DIRENT_PER_CHAR (CHAR_BIT / 2) +static const WCHAR namespace_prefix[] = {L'\\', L'\\', L'?', L'\\'}; + +enum {FINAL_PATH_MAX = PATH_MAX + numberof(namespace_prefix)}; + /* License: Artistic or GPL */ static HANDLE open_dir_handle(const WCHAR *filename, WIN32_FIND_DATAW *fd) { HANDLE fh; - WCHAR fullname[PATH_MAX + rb_strlen_lit("\\*")]; + WCHAR fullname[FINAL_PATH_MAX + rb_strlen_lit("\\*")]; WCHAR *p; int len = 0; @@ -2004,8 +2008,12 @@ open_dir_handle(const WCHAR *filename, WIN32_FIND_DATAW *fd) fh = open_special(filename, 0, 0); if (fh != INVALID_HANDLE_VALUE) { - len = get_final_path(fh, fullname, PATH_MAX, 0); + len = get_final_path(fh, fullname, FINAL_PATH_MAX, 0); CloseHandle(fh); + if (len >= FINAL_PATH_MAX) { + errno = ENAMETOOLONG; + return INVALID_HANDLE_VALUE; + } } if (!len) { len = lstrlenW(filename); @@ -5666,8 +5674,6 @@ path_drive(const WCHAR *path) towupper(path[0]) - L'A' : _getdrive() - 1; } -static const WCHAR namespace_prefix[] = {L'\\', L'\\', L'?', L'\\'}; - /* License: Ruby's */ static int winnt_stat(const WCHAR *path, struct stati128 *st, BOOL lstat) -- cgit v1.2.1