summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-02-21 13:12:03 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-02-22 19:48:15 +0900
commit67d2619463061beafe86a773310962365380577f (patch)
treec75606d1d8570c0423e323f7f33b60eff4a09c54 /win32
parent4e32a4ab81d510b1cb3cd45f7faafc917aa071cc (diff)
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.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4210
Diffstat (limited to 'win32')
-rw-r--r--win32/win32.c14
1 files changed, 10 insertions, 4 deletions
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)