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

ruby-changes:12708

From: nobu <ko1@a...>
Date: Thu, 6 Aug 2009 16:27:06 +0900 (JST)
Subject: [ruby-changes:12708] Ruby:r24424 (trunk): * encoding.c (valid_encoding_name_p): rejects too long encoding

nobu	2009-08-06 16:26:49 +0900 (Thu, 06 Aug 2009)

  New Revision: 24424

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

  Log:
    * encoding.c (valid_encoding_name_p): rejects too long encoding
      names.

  Modified files:
    trunk/ChangeLog
    trunk/encoding.c

Index: encoding.c
===================================================================
--- encoding.c	(revision 24423)
+++ encoding.c	(revision 24424)
@@ -45,6 +45,9 @@
 #define ENCODING_COUNT ENCINDEX_BUILTIN_MAX
 #define UNSPECIFIED_ENCODING INT_MAX
 
+#define ENCODING_NAMELEN_MAX 63
+#define valid_encoding_name_p(name) ((name) && strlen(name) <= ENCODING_NAMELEN_MAX)
+
 #define enc_autoload_p(enc) (!rb_enc_mbmaxlen(enc))
 
 static int load_encoding(const char *name);
@@ -189,6 +192,7 @@
     struct rb_encoding_entry *ent = &enc_table.list[index];
     VALUE list;
 
+    if (!valid_encoding_name_p(name)) return -1;
     if (!ent->name) {
 	ent->name = name = strdup(name);
     }
@@ -384,6 +388,7 @@
 static int
 enc_alias(const char *alias, int idx)
 {
+    if (!valid_encoding_name_p(alias)) return -1;
     alias = enc_alias_internal(alias, idx);
     set_encoding_const(alias, rb_enc_from_index(idx));
     return idx;
@@ -1078,7 +1083,7 @@
     snprintf(cp, sizeof cp, "CP%d", AreFileApisANSI() ? GetACP() : GetOEMCP());
     enc = rb_enc_find(cp);
 #elif defined __APPLE__
-    enc = rb_enc_find("UTF-8");
+    enc = rb_utf8_encoding();
 #else
     enc = rb_default_external_encoding();
 #endif
@@ -1290,17 +1295,22 @@
 	}
     }
     if (!*s) {
+	if (s - name > ENCODING_NAMELEN_MAX) return;
 	valid = 1;
 	rb_define_const(rb_cEncoding, name, encoding);
     }
     if (!valid || haslower) {
-	int len = strlen(name) + 1;
+	size_t len = s - name;
+	if (len > ENCODING_NAMELEN_MAX) return;
 	if (!haslower || !hasupper) {
 	    do {
 		if (ISLOWER(*s)) haslower = 1;
 		if (ISUPPER(*s)) hasupper = 1;
 	    } while (*++s && (!haslower || !hasupper));
+	    len = s - name;
 	}
+	len += strlen(s);
+	if (len++ > ENCODING_NAMELEN_MAX) return;
 	MEMCPY(s = ALLOCA_N(char, len), name, char, len);
 	name = s;
 	if (!valid) {
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24423)
+++ ChangeLog	(revision 24424)
@@ -1,5 +1,8 @@
-Thu Aug  6 16:25:08 2009  Nobuyoshi Nakada  <nobu@r...>
+Thu Aug  6 16:26:46 2009  Nobuyoshi Nakada  <nobu@r...>
 
+	* encoding.c (valid_encoding_name_p): rejects too long encoding
+	  names.
+
 	* encoding.c (encoding_data_type): typed data.
 
 	* encoding.c (enc_capable, rb_enc_get_index): Symbol is encoding

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

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