Reject encodings determined at runtime as source code encodings

The encodings determined at runtime are affected by the runtime
environment, such as the OS and locale, while the file contents are
not.
This commit is contained in:
Nobuyoshi Nakada 2024-01-11 18:46:51 +09:00
parent 0480c07344
commit 3d3bc029c5
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465
2 changed files with 38 additions and 1 deletions

11
parse.y
View File

@ -9477,11 +9477,20 @@ parser_encode_length(struct parser_params *p, const char *name, long len)
static void
parser_set_encode(struct parser_params *p, const char *name)
{
int idx = rb_enc_find_index(name);
rb_encoding *enc;
VALUE excargs[3];
const char *wrong = 0;
switch (*name) {
case 'e': case 'E': wrong = "external"; break;
case 'i': case 'I': wrong = "internal"; break;
case 'f': case 'F': wrong = "filesystem"; break;
case 'l': case 'L': wrong = "locale"; break;
}
if (wrong && STRCASECMP(name, wrong) == 0) goto unknown;
int idx = rb_enc_find_index(name);
if (idx < 0) {
unknown:
excargs[1] = rb_sprintf("unknown encoding name: %s", name);
error:
excargs[0] = rb_eArgError;

View File

@ -767,6 +767,34 @@ x = __ENCODING__
END
end
assert_equal(__ENCODING__, x)
assert_raise(ArgumentError) do
EnvUtil.with_default_external(Encoding::US_ASCII) {eval <<-END, nil, __FILE__, __LINE__+1}
# coding = external
x = __ENCODING__
END
end
assert_raise(ArgumentError) do
EnvUtil.with_default_internal(Encoding::US_ASCII) {eval <<-END, nil, __FILE__, __LINE__+1}
# coding = internal
x = __ENCODING__
END
end
assert_raise(ArgumentError) do
eval <<-END, nil, __FILE__, __LINE__+1
# coding = filesystem
x = __ENCODING__
END
end
assert_raise(ArgumentError) do
eval <<-END, nil, __FILE__, __LINE__+1
# coding = locale
x = __ENCODING__
END
end
end
def test_utf8_bom