From cfa3ebf47c33d930c58ac735db65dd2e3346367a Mon Sep 17 00:00:00 2001 From: nobu Date: Sun, 22 Mar 2015 04:54:35 +0000 Subject: file.c: check arguments lengths * win32/file.c (rb_file_expand_path_internal): check arguments lengths and should not loose preci quielty. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50054 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- win32/file.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'win32') diff --git a/win32/file.c b/win32/file.c index 0fddaaaa8e..1884f2a9b1 100644 --- a/win32/file.c +++ b/win32/file.c @@ -350,7 +350,14 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na /* convert char * to wchar_t */ if (!NIL_P(path)) { - wpath = mbstr_to_wstr(cp, RSTRING_PTR(path), (int)RSTRING_LEN(path), &wpath_len); + const long path_len = RSTRING_LEN(path); +#if SIZEOF_INT < SIZEOF_LONG + if ((long)(int)path_len != path_len) { + rb_raise(rb_eRangeError, "path (%ld bytes) is too long", + path_len); + } +#endif + wpath = mbstr_to_wstr(cp, RSTRING_PTR(path), path_len, &wpath_len); wpath_pos = wpath; } @@ -425,7 +432,15 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na /* convert char * to wchar_t */ if (!NIL_P(dir)) { - wdir = mbstr_to_wstr(cp, RSTRING_PTR(dir), (int)RSTRING_LEN(dir), &wdir_len); + const long dir_len = RSTRING_LEN(dir); +#if SIZEOF_INT < SIZEOF_LONG + if ((long)(int)dir_len != dir_len) { + if (wpath) xfree(wpath); + rb_raise(rb_eRangeError, "base directory (%ld bytes) is too long", + dir_len); + } +#endif + wdir = mbstr_to_wstr(cp, RSTRING_PTR(dir), dir_len, &wdir_len); wdir_pos = wdir; } -- cgit v1.2.3