From e8c62836a6292bf2f691de458b24ea50c51b452a Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 15 Dec 2019 23:13:16 +0900 Subject: IO#set_encoding_by_bom should err when encoding is already set Except for ASCII-8BIT. [Bug #16422] --- io.c | 4 ++++ test/ruby/test_io_m17n.rb | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/io.c b/io.c index 63d8172e07..eaaccbbe07 100644 --- a/io.c +++ b/io.c @@ -8334,6 +8334,10 @@ rb_io_set_encoding_by_bom(VALUE io) if (fptr->encs.enc2) { rb_raise(rb_eArgError, "encoding conversion is set"); } + else if (fptr->encs.enc && fptr->encs.enc != rb_ascii8bit_encoding()) { + rb_raise(rb_eArgError, "encoding is set to %s already", + rb_enc_name(fptr->encs.enc)); + } if (!io_set_encoding_by_bom(io)) return Qnil; return rb_enc_from_encoding(fptr->encs.enc); } diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb index 022ff330b5..e5b0ef0585 100644 --- a/test/ruby/test_io_m17n.rb +++ b/test/ruby/test_io_m17n.rb @@ -2102,6 +2102,9 @@ EOT File.open(path, "rb") {|f| assert_equal(Encoding.find(name), f.set_encoding_by_bom) } + File.open(path, "rb", encoding: "iso-8859-1") {|f| + assert_raise(ArgumentError) {f.set_encoding_by_bom} + } } end end @@ -2114,6 +2117,10 @@ EOT bug3407 = '[ruby-core:30641]' result = File.read(path, encoding: 'BOM|UTF-8') assert_equal("a", result.b, bug3407) + + File.open(path, "rb", encoding: "iso-8859-1") {|f| + assert_raise(ArgumentError) {f.set_encoding_by_bom} + } } end @@ -2148,6 +2155,9 @@ EOT File.open(path, "rb") {|f| assert_nil(f.set_encoding_by_bom) } + File.open(path, "rb", encoding: "iso-8859-1") {|f| + assert_raise(ArgumentError) {f.set_encoding_by_bom} + } } end -- cgit v1.2.3