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/