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

ruby-changes:16224

From: nobu <ko1@a...>
Date: Sun, 6 Jun 2010 22:37:50 +0900 (JST)
Subject: [ruby-changes:16224] Ruby:r28190 (trunk, ruby_1_9_2): * string.c (rb_str_buf_cat_escaped_char): get rid of buffer

nobu	2010-06-06 22:37:23 +0900 (Sun, 06 Jun 2010)

  New Revision: 28190

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

  Log:
    * string.c (rb_str_buf_cat_escaped_char): get rid of buffer
      overflow on platforms int is bigger than 32bit, and warnings.

  Modified files:
    branches/ruby_1_9_2/ChangeLog
    branches/ruby_1_9_2/string.c
    trunk/ChangeLog
    trunk/string.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28189)
+++ ChangeLog	(revision 28190)
@@ -1,3 +1,8 @@
+Sun Jun  6 22:37:11 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* string.c (rb_str_buf_cat_escaped_char): get rid of buffer
+	  overflow on platforms int is bigger than 32bit, and warnings.
+
 Sun Jun  6 19:55:21 2010  Tanaka Akira  <akr@f...>
 
 	* array.c (rb_ary_product): clear uninitialized elements in temporary
@@ -40,7 +45,7 @@
 	* re.c (rb_reg_expr_str): use rb_str_buf_cat_escaped_char
 	  when resenc is given: for Regexp#inspect or error message.
 
-	  * re.c (rb_reg_desc): add 'n' for ENCODING_NONE.
+	* re.c (rb_reg_desc): add 'n' for ENCODING_NONE.
 
 Sat Jun  5 01:20:14 2010  NARUSE, Yui  <naruse@r...>
 
Index: string.c
===================================================================
--- string.c	(revision 28189)
+++ string.c	(revision 28190)
@@ -4081,9 +4081,14 @@
 #define CHAR_ESC_LEN 13 /* sizeof(\x{ hex of 32bit unsigned int } \0) */
 
 int
-rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p) {
+rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p)
+{
     char buf[CHAR_ESC_LEN + 1];
     int l;
+
+#if SIZEOF_INT > 4
+    c &= 0xffffffff;
+#endif
     if (unicode_p) {
 	if (c < 0x7F && ISPRINT(c)) {
 	    snprintf(buf, CHAR_ESC_LEN, "%c", c);
@@ -4103,7 +4108,7 @@
 	    snprintf(buf, CHAR_ESC_LEN, "\\x{%X}", c);
 	}
     }
-    l = strlen(buf);
+    l = (int)strlen(buf);	/* CHAR_ESC_LEN cannot exceed INT_MAX */
     rb_str_buf_cat(result, buf, l);
     return l;
 }
Index: ruby_1_9_2/ChangeLog
===================================================================
--- ruby_1_9_2/ChangeLog	(revision 28189)
+++ ruby_1_9_2/ChangeLog	(revision 28190)
@@ -1,3 +1,8 @@
+Sun Jun  6 22:37:11 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* string.c (rb_str_buf_cat_escaped_char): get rid of buffer
+	  overflow on platforms int is bigger than 32bit, and warnings.
+
 Sun Jun  6 10:44:34 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* array.c (rb_ary_product): need to set the length in order to get
@@ -32,7 +37,7 @@
 	* re.c (rb_reg_expr_str): use rb_str_buf_cat_escaped_char
 	  when resenc is given: for Regexp#inspect or error message.
 
-	  * re.c (rb_reg_desc): add 'n' for ENCODING_NONE.
+	* re.c (rb_reg_desc): add 'n' for ENCODING_NONE.
 
 Sat Jun  5 23:15:42 2010  NARUSE, Yui  <naruse@r...>
 
Index: ruby_1_9_2/string.c
===================================================================
--- ruby_1_9_2/string.c	(revision 28189)
+++ ruby_1_9_2/string.c	(revision 28190)
@@ -4081,9 +4081,14 @@
 #define CHAR_ESC_LEN 13 /* sizeof(\x{ hex of 32bit unsigned int } \0) */
 
 int
-rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p) {
+rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p)
+{
     char buf[CHAR_ESC_LEN + 1];
     int l;
+
+#if SIZEOF_INT > 4
+    c &= 0xffffffff;
+#endif
     if (unicode_p) {
 	if (c < 0x7F && ISPRINT(c)) {
 	    snprintf(buf, CHAR_ESC_LEN, "%c", c);
@@ -4103,7 +4108,7 @@
 	    snprintf(buf, CHAR_ESC_LEN, "\\x{%X}", c);
 	}
     }
-    l = strlen(buf);
+    l = (int)strlen(buf);	/* CHAR_ESC_LEN cannot exceed INT_MAX */
     rb_str_buf_cat(result, buf, l);
     return l;
 }

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

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