summaryrefslogtreecommitdiff
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
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
-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)