Project

General

Profile

Actions

Bug #858

closed

r20625 dumps core and many strings associated with wrong encoding

Added by yugui (Yuki Sonoda) over 12 years ago. Updated almost 10 years ago.

Status:
Closed
Priority:
Normal
ruby -v:
Backport:
[ruby-dev:37390]

Description

=begin
Yuguiです。

r20625で、default_externalもdefault_internal同様に未設定時に
(rb_encoding_t*)NULL を返すようになった結果、trunkでruby -e 1とするとコ
アを吐くようになりました。

とりあえず、直すのはしてみました。結果として、process_options中に幾つか
default_externalに依存するオブジェクトを生成していることが分かりました。

  • ruby_process_options()内。ruby_script()経由rb_progname:
    どうせあとで再設定しているので、ASCII-8BITで仮構築

  • process_options()内。ruby_script()経由rb_progname:
    直後にlocale encodingをassociateしているので、構築時はASCII-8BIT

  • rb_init_load_path_safeが設定するLOAD_PATH

  • -Iで設定されるLOAD_PATH
    一応、default_externalを意図しているらしいので、default_externalの決定
    後にassociateするようにしてみました。

  • gem_prelude.rb:291で開いたIO
    特に何もしていないもののあまり問題はなさそう?

  • これにより設定されるLOAD_PATH
    一緒にdefault_external決定後にそれをassociateしてしまいましたが、良いの
    かな?

--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする
=end

Actions #1

Updated by yugui (Yuki Sonoda) over 12 years ago

=begin
Yugui (Yuki Sonoda) さんは書きました:

とりあえず、直すのはしてみました。結果として、process_options中に幾つか
default_externalに依存するオブジェクトを生成していることが分かりました。

パッチを添付し忘れました。

修正方針ってこれで良いものでしょうか?

  • LOAD_PATHのエンコーディングはどうするべき?
    -E を考慮したdefault_externalか、それともlocale encodingを強制するか

  • prelude内でのIOはどれほど許される?

  • なぜこんなに早いタイミングでpreludeが実行されてるんでしょうか?

  • rb_prognameをrb_gc_register_mark_objectしていましたが、rb_prognameはあ
    とから上書きされているのでこちらもrb_gc_register_mark_objectしないとまずい?

--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする

diff --git a/encoding.c b/encoding.c
index 3253bfd..cd84af4 100644
--- a/encoding.c
+++ b/encoding.c
@@ -1072,7 +1072,7 @@ enc_set_default_encoding(struct default_encoding *def, VALUE encoding,
return overridden;
}

-static struct default_encoding default_external = {-2};
+static struct default_encoding default_external = {0};

rb_encoding *
rb_default_external_encoding(void)
diff --git a/gem_prelude.rb b/gem_prelude.rb
index ddc56c8..336dfac 100644
--- a/gem_prelude.rb
+++ b/gem_prelude.rb
@@ -2,6 +2,10 @@
# vim: filetype=ruby
# THIS FILE WAS AUTOGENERATED, DO NOT EDIT

+# NOTICE: Ruby is during initialization here.
+# * Encoding.default_external is always ASCII-8BIT.
+# * Should not expect Encoding.default_internal.
+# * Locale encoding is available.
if defined?(Gem) then

module Kernel

diff --git a/ruby.c b/ruby.c
index 913b454..0897c69 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1097,6 +1097,8 @@ true_value(void)
#define rb_define_readonly_boolean(name, val) \
rb_define_virtual_variable((name), (val) ? true_value : false_value, 0)

+static void fix_objects_associated_with_default_external(void);
+
static VALUE
process_options(VALUE arg)
{
@@ -1178,7 +1180,7 @@ process_options(VALUE arg)
}
}

  • ruby_script(opt->script);
  • rb_progname = rb_obj_freeze(rb_str_new_cstr(opt->script)); #if defined DOSISH || defined CYGWIN translate_char(RSTRING_PTR(rb_progname), '\', '/'); #endif @@ -1211,6 +1213,7 @@ process_options(VALUE arg) enc = lenc; } rb_enc_set_default_external(rb_enc_from_encoding(enc));
  • fix_objects_associated_with_default_external();
    if (opt->intern.enc.index >= 0) {
    enc = rb_enc_from_index(opt->intern.enc.index);
    rb_enc_set_default_internal(rb_enc_from_encoding(enc));
    @@ -1287,6 +1290,18 @@ process_options(VALUE arg)

    return iseq;
    }
    +static void
    +fix_objects_associated_with_default_external(void)
    +{

  • int i;

  • VALUE load_path = GET_VM()->load_path;
    +

  • for (i = 0; i < RARRAY_LEN(load_path); ++i) {

  •    VALUE path = rb_ary_entry(load_path, i);
    
  •    rb_enc_associate(path, rb_default_external_encoding());
    
  •    rb_ary_store(load_path, i, path);
    
  • }
    +}

struct load_file_arg {
VALUE parser;
@@ -1669,10 +1684,10 @@ ruby_process_options(int argc, char **argv)
struct cmdline_arguments args;
struct cmdline_options opt;
NODE *tree;

  • VALUE tmp_progname; /* rb_progname will set with right encoding later */

  • ruby_script(argv[0]); /* for the time being */

  • rb_argv0 = rb_str_new4(rb_progname);

  • rb_gc_register_mark_object(rb_argv0);

  • tmp_progname = rb_obj_freeze(rb_str_new_cstr(argv[0]));

  • rb_obj_freeze(tmp_progname);
    args.argc = argc;
    args.argv = argv;
    args.opt = cmdline_options_init(&opt);
    @@ -1680,7 +1695,7 @@ ruby_process_options(int argc, char **argv)
    opt.intern.enc.index = -1;
    tree = (NODE *)rb_vm_call_cfunc(rb_vm_top_self(),
    process_options, (VALUE)&args,

  •              0, rb_progname);
    
  •              0, tmp_progname);
    

    return tree;
    }

=end

Actions #2

Updated by yugui (Yuki Sonoda) over 12 years ago

  • Category set to M17N
  • Assignee set to nobu (Nobuyoshi Nakada)
  • Priority changed from 3 to 5
  • Target version set to 1.9.1 Release Candidate

=begin

=end

Actions #3

Updated by matz (Yukihiro Matsumoto) over 12 years ago

=begin
まつもと ゆきひろです

In message "Re: [ruby-dev:37390] [BUG:trunk] r20625 dumps core and many strings associated with wrong encoding"
on Thu, 11 Dec 2008 23:10:52 +0900, "Yugui (Yuki Sonoda)" yugui@yugui.jp writes:

|r20625で、default_externalもdefault_internal同様に未設定時に
|(rb_encoding_t*)NULL を返すようになった結果、trunkでruby -e 1とするとコ
|アを吐くようになりました。

あらら。default_externalについては未設定時はlocale_encoding
を返せばいいんじゃないですかね。って、そういう問題じゃない?

=end

Actions #4

Updated by matz (Yukihiro Matsumoto) over 12 years ago

=begin
まつもと ゆきひろです

In message "Re: [ruby-dev:37391] Re: [BUG:trunk] r20625 dumps core and many strings associated with wrong encoding"
on Thu, 11 Dec 2008 23:18:43 +0900, "Yugui (Yuki Sonoda)" yugui@yugui.jp writes:

|修正方針ってこれで良いものでしょうか?
|* LOAD_PATHのエンコーディングはどうするべき?
| -E を考慮したdefault_externalか、それともlocale encodingを強制するか

-Eを考慮すべきですが、オプションの処理をさかのぼる必要はない
のではないかと思います。つまり、PATHの中身と-Eより前に指定さ
れた-Iについてはlocaleと見なすとか。

|* prelude内でのIOはどれほど許される?

許されるんじゃないかと。あまりpreludeが重いのは推奨しがたい
のですが(だから本当はgem_preludeはかなりイヤ)。

|* なぜこんなに早いタイミングでpreludeが実行されてるんでしょうか?

これはよくわかりません。プログラム実行直前が望ましい気がしま
すが。

|* rb_prognameをrb_gc_register_mark_objectしていましたが、rb_prognameはあ
|とから上書きされているのでこちらもrb_gc_register_mark_objectしないとまずい?

rb_gc_register_mark_object()されているのはrb_argv0ですよね。
rb_progname自身はVMから参照されているのでmarkは不要ではない
かと。

                             まつもと ゆきひろ /:|)

=end

Actions #5

Updated by yugui (Yuki Sonoda) over 12 years ago

=begin
Yuguiです。

Yukihiro Matsumoto さんは書きました:

まつもと ゆきひろです
あらら。default_externalについては未設定時はlocale_encoding
を返せばいいんじゃないですかね。って、そういう問題じゃない?

何らかのエンコーディングを返さざるを得ませんが、私のパッチのASCII-8BIT決
め打ちよりはlocale encodingを返しておいたほうが良さそうですね。

--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする

=end

Actions #6

Updated by yugui (Yuki Sonoda) over 12 years ago

=begin
Yukihiro Matsumoto さんは書きました:

まつもと ゆきひろです
|修正方針ってこれで良いものでしょうか?
|* LOAD_PATHのエンコーディングはどうするべき?
| -E を考慮したdefault_externalか、それともlocale encodingを強制するか

-Eを考慮すべきですが、オプションの処理をさかのぼる必要はない
のではないかと思います。つまり、PATHの中身と-Eより前に指定さ
れた-Iについてはlocaleと見なすとか。

あー、rb_file_systemencodingの選択肢もありますよね。パス名のエンコーディ
ングをどう持つかは色々悩ましかったと思います。どうしたもんでしょう。
とりあえずlocaleにしておきますね。(r20656)

before:
ANG=ja_JP.UTF-8 ./ruby -Ecp932 -I tmp -e 'p $:.map{|x| [x, x.encoding]};
require "date"; p $LOADED_FEATURES.map{|x| [x, x.encoding]}'
[["/Users/yugui/src/ruby/mri/build/O0/tmp", #Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/gems/1.9.1/gems/evil-ruby-0.1.0/lib",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/site_ruby/1.9.1",
#Encoding:ASCII-8BIT],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/site_ruby/1.9.1/i386-darwin9.5.0",
#Encoding:ASCII-8BIT],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/site_ruby",
#Encoding:ASCII-8BIT],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/vendor_ruby/1.9.1",
#Encoding:ASCII-8BIT],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/vendor_ruby/1.9.1/i386-darwin9.5.0",
#Encoding:ASCII-8BIT],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/vendor_ruby",
#Encoding:ASCII-8BIT],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1",
#Encoding:ASCII-8BIT],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/i386-darwin9.5.0",
#Encoding:ASCII-8BIT], [".", #Encoding:ASCII-8BIT]]

[["enumerator.so", #Encoding:ASCII-8BIT],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/i386-darwin9.5.0/enc/encdb.bundle",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/i386-darwin9.5.0/enc/trans/transdb.bundle",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/rubygems.rb",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/i386-darwin9.5.0/enc/shift_jis.bundle",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/date/format.rb",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/date.rb",
#Encoding:US-ASCII]]

after:
[["/Users/yugui/src/ruby/mri/build/O0/tmp", #Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/gems/1.9.1/gems/evil-ruby-0.1.0/lib",
#Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/site_ruby/1.9.1",
#Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/site_ruby/1.9.1/i386-darwin9.5.0",
#Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/site_ruby",
#Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/vendor_ruby/1.9.1",
#Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/vendor_ruby/1.9.1/i386-darwin9.5.0",
#Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/vendor_ruby",
#Encoding:UTF-8], ["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1",
#Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/i386-darwin9.5.0",
#Encoding:UTF-8], [".", #Encoding:UTF-8]]

[["enumerator.so", #Encoding:ASCII-8BIT],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/i386-darwin9.5.0/enc/encdb.bundle",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/i386-darwin9.5.0/enc/trans/transdb.bundle",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/rubygems.rb",
#Encoding:UTF-8],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/i386-darwin9.5.0/enc/shift_jis.bundle",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/date/format.rb",
#Encoding:US-ASCII],
["/Users/yugui/varyrubies/trunk-O0/lib/ruby/1.9.1/date.rb",
#Encoding:US-ASCII]]

--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする

=end

Actions #7

Updated by yugui (Yuki Sonoda) over 12 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
Applied in changeset r20656.
=end

Actions

Also available in: Atom PDF