aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--encoding.c15
2 files changed, 19 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 6520440728..52fcf71383 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu Dec 2 21:22:05 2010 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * encoding.c (enc_alias_internal): free the copied key and
+ return NULL when given key is already regisitered.
+
+ * encoding.c (enc_alias): call set_encoding_const only when the
+ alias is not registered yet.
+
Thu Dec 2 19:58:24 2010 URABE Shyouhei <shyouhei@ruby-lang.org>
* vm.c (ruby_vm_at_exit): new API. This enables extension libs to
diff --git a/encoding.c b/encoding.c
index 76dfac790b..db0f5c8ae6 100644
--- a/encoding.c
+++ b/encoding.c
@@ -436,12 +436,19 @@ rb_enc_unicode_p(rb_encoding *enc)
return name[0] == 'U' && name[1] == 'T' && name[2] == 'F' && name[4] != '7';
}
+/*
+ * Returns copied alias name when the key is added for st_table,
+ * else returns NULL.
+ */
static const char *
enc_alias_internal(const char *alias, int idx)
{
- alias = strdup(alias);
- st_insert(enc_table.names, (st_data_t)alias, (st_data_t)idx);
- return alias;
+ char *name = strdup(alias);
+ if (st_insert(enc_table.names, (st_data_t)name, (st_data_t)idx)) {
+ free(name);
+ return NULL;
+ }
+ return name;
}
static int
@@ -449,7 +456,7 @@ 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));
+ if (alias) set_encoding_const(alias, rb_enc_from_index(idx));
return idx;
}