diff options
author | NARUSE, Yui <naruse@airemix.jp> | 2021-04-02 16:06:31 +0900 |
---|---|---|
committer | NARUSE, Yui <naruse@airemix.jp> | 2021-04-02 16:06:31 +0900 |
commit | 4e2738f477b5343a0d48a400c975220fed123c9b (patch) | |
tree | de0b2bc713498c3a26c3f4dac5fa0daee58b8bc5 /encoding.c | |
parent | 855401da495117fcf5d258fe43b71010abc43d9a (diff) |
merge revision(s) 7e8a9af9db42a21f6a1125a29e98c45ff9d5833b: [Backport #17732]
rb_enc_interned_str: handle autoloaded encodings
If called with an autoloaded encoding that was not yet
initialized, `rb_enc_interned_str` would crash with
a NULL pointer exception.
See: https://github.com/ruby/ruby/pull/4119#issuecomment-800189841
---
encoding.c | 28 ++++++++++++----------------
ext/-test-/string/depend | 3 +++
ext/-test-/string/fstring.c | 15 +++++++++++++++
internal/encoding.h | 3 +++
string.c | 4 ++++
test/-ext-/string/test_fstring.rb | 16 ++++++++++++++++
6 files changed, 53 insertions(+), 16 deletions(-)
Diffstat (limited to 'encoding.c')
-rw-r--r-- | encoding.c | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/encoding.c b/encoding.c index 330be29f4b..32d5a349eb 100644 --- a/encoding.c +++ b/encoding.c @@ -101,8 +101,6 @@ static rb_encoding *global_enc_ascii, #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 const rb_data_type_t encoding_data_type = { "encoding", {0, 0, 0,}, @@ -207,16 +205,14 @@ rb_enc_dummy_p(rb_encoding *enc) return ENC_DUMMY_P(enc) != 0; } -static int enc_autoload(rb_encoding *); - static int check_encoding(rb_encoding *enc) { int index = rb_enc_to_index(enc); if (rb_enc_from_index(index) != enc) return -1; - if (enc_autoload_p(enc)) { - index = enc_autoload(enc); + if (rb_enc_autoload_p(enc)) { + index = rb_enc_autoload(enc); } return index; } @@ -260,7 +256,7 @@ must_encindex(int index) rb_raise(rb_eEncodingError, "wrong encoding index %d for %s (expected %d)", index, rb_enc_name(enc), ENC_TO_ENCINDEX(enc)); } - if (enc_autoload_p(enc) && enc_autoload(enc) == -1) { + if (rb_enc_autoload_p(enc) && rb_enc_autoload(enc) == -1) { rb_loaderror("failed to load encoding (%s)", rb_enc_name(enc)); } @@ -444,7 +440,7 @@ rb_enc_register(const char *name, rb_encoding *encoding) if (STRCASECMP(name, rb_enc_name(oldenc))) { index = enc_register(enc_table, name, encoding); } - else if (enc_autoload_p(oldenc) || !ENC_DUMMY_P(oldenc)) { + else if (rb_enc_autoload_p(oldenc) || !ENC_DUMMY_P(oldenc)) { enc_register_at(enc_table, index, name, encoding); } else { @@ -834,7 +830,7 @@ load_encoding(const char *name) else if ((idx = enc_registered(enc_table, name)) < 0) { idx = -1; } - else if (enc_autoload_p(enc_table->list[idx].enc)) { + else if (rb_enc_autoload_p(enc_table->list[idx].enc)) { idx = -1; } } @@ -853,8 +849,8 @@ enc_autoload_body(struct enc_table *enc_table, rb_encoding *enc) do { if (i >= enc_table->count) return -1; } while (enc_table->list[i].enc != base && (++i, 1)); - if (enc_autoload_p(base)) { - if (enc_autoload(base) < 0) return -1; + if (rb_enc_autoload_p(base)) { + if (rb_enc_autoload(base) < 0) return -1; } i = enc->ruby_encoding_index; enc_register_at(enc_table, i & ENC_INDEX_MASK, rb_enc_name(enc), base); @@ -867,8 +863,8 @@ enc_autoload_body(struct enc_table *enc_table, rb_encoding *enc) } } -static int -enc_autoload(rb_encoding *enc) +int +rb_enc_autoload(rb_encoding *enc) { int i; GLOBAL_ENC_TABLE_EVAL(enc_table, i = enc_autoload_body(enc_table, enc)); @@ -895,8 +891,8 @@ rb_enc_find_index(const char *name) rb_raise(rb_eArgError, "encoding %s is not registered", name); } } - else if (enc_autoload_p(enc)) { - if (enc_autoload(enc) < 0) { + else if (rb_enc_autoload_p(enc)) { + if (rb_enc_autoload(enc) < 0) { rb_warn("failed to load encoding (%s); use ASCII-8BIT instead", name); return 0; @@ -1340,7 +1336,7 @@ enc_inspect(VALUE self) "#<%"PRIsVALUE":%s%s%s>", rb_obj_class(self), rb_enc_name(enc), (ENC_DUMMY_P(enc) ? " (dummy)" : ""), - enc_autoload_p(enc) ? " (autoload)" : ""); + rb_enc_autoload_p(enc) ? " (autoload)" : ""); } /* |