Project

General

Profile

Bug #17262 ยป 0001-Check-encoding-name-to-replicate.patch

7ffd14a18c34 for 2.7 or earlier - nobu (Nobuyoshi Nakada), 10/15/2020 08:11 AM

View differences:

encoding.c
rb_to_encoding_index(VALUE enc)
{
int idx;
const char *name;
idx = enc_check_encoding(enc);
if (idx >= 0) {
......
if (!rb_enc_asciicompat(rb_enc_get(enc))) {
return -1;
}
return rb_enc_find_index(StringValueCStr(enc));
if (!(name = rb_str_to_cstr(enc))) {
return -1;
}
return rb_enc_find_index(name);
}
static const char *
name_for_encoding(volatile VALUE *enc)
{
VALUE name = StringValue(*enc);
const char *n;
if (!rb_enc_asciicompat(rb_enc_get(name))) {
rb_raise(rb_eArgError, "invalid encoding name (non ASCII)");
}
if (!(n = rb_str_to_cstr(name))) {
rb_raise(rb_eArgError, "invalid encoding name (NUL byte)");
}
return n;
}
/* Returns encoding index or UNSPECIFIED_ENCODING */
static int
str_find_encindex(VALUE enc)
{
int idx;
StringValue(enc);
if (!rb_enc_asciicompat(rb_enc_get(enc))) {
rb_raise(rb_eArgError, "invalid name encoding (non ASCII)");
}
idx = rb_enc_find_index(StringValueCStr(enc));
int idx = rb_enc_find_index(name_for_encoding(&enc));
RB_GC_GUARD(enc);
return idx;
}
......
{
int index = enc_table->count;
if ((index = enc_table_expand(enc_table, index + 1)) < 0) return -1;
enc_table->count = index;
return enc_register_at(enc_table, index - 1, name, encoding);
enc_table->count = enc_table_expand(enc_table, index + 1);
return enc_register_at(enc_table, index, name, encoding);
}
static void set_encoding_const(const char *, rb_encoding *);
......
enc_check_duplication(enc_table, name);
idx = enc_register(enc_table, name, encoding);
if (idx < 0) rb_raise(rb_eArgError, "invalid encoding name: %s", name);
set_base_encoding(enc_table, idx, encoding);
set_encoding_const(name, rb_enc_from_index(idx));
return idx;
......
static VALUE
enc_replicate_m(VALUE encoding, VALUE name)
{
return rb_enc_from_encoding_index(
rb_enc_replicate(StringValueCStr(name),
rb_to_encoding(encoding)));
int idx = rb_enc_replicate(name_for_encoding(&name), rb_to_encoding(encoding));
RB_GC_GUARD(name);
return rb_enc_from_encoding_index(idx);
}
static int
test/ruby/test_encoding.rb
assert_instance_of(Encoding, Encoding::ISO_2022_JP.replicate("ISO-2022-JP-ANOTHER#{Time.now.to_f}"))
bug3127 = '[ruby-dev:40954]'
assert_raise(TypeError, bug3127) {Encoding::UTF_8.replicate(0)}
assert_raise(ArgumentError, bug3127) {Encoding::UTF_8.replicate("\0")}
assert_raise_with_message(ArgumentError, /\bNUL\b/, bug3127) {Encoding::UTF_8.replicate("\0")}
END;
end
......
assert_equal(e, (("x"*30).force_encoding(e)*1).encoding)
GC.start
name = "A" * 64
Encoding.list.each do |enc|
assert_raise(ArgumentError) {enc.replicate(name)}
name.succ!
end
end;
end
test/ruby/test_io_m17n.rb
assert_equal(eucjp, r.read)
end)
assert_raise_with_message(ArgumentError, /invalid name encoding/) do
assert_raise_with_message(ArgumentError, /invalid encoding name/) do
with_pipe("UTF-8", "UTF-8".encode("UTF-32BE")) {}
end
assert_raise_with_message(ArgumentError, /invalid name encoding/) do
assert_raise_with_message(ArgumentError, /invalid encoding name/) do
with_pipe("UTF-8".encode("UTF-32BE")) {}
end
    (1-1/1)