[前][次][番号順一覧][スレッド一覧]

ruby-changes:37973

From: nobu <ko1@a...>
Date: Sun, 22 Mar 2015 13:54:52 +0900 (JST)
Subject: [ruby-changes:37973] nobu:r50054 (trunk): file.c: check arguments lengths

nobu	2015-03-22 13:54:35 +0900 (Sun, 22 Mar 2015)

  New Revision: 50054

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=50054

  Log:
    file.c: check arguments lengths
    
    * win32/file.c (rb_file_expand_path_internal): check arguments
      lengths and should not loose preci quielty.

  Modified files:
    trunk/win32/file.c
Index: win32/file.c
===================================================================
--- win32/file.c	(revision 50053)
+++ win32/file.c	(revision 50054)
@@ -350,7 +350,14 @@ rb_file_expand_path_internal(VALUE fname https://github.com/ruby/ruby/blob/trunk/win32/file.c#L350
 
     /* 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 https://github.com/ruby/ruby/blob/trunk/win32/file.c#L432
 
 	/* 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;
 	}
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]