mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
hash.c: check env vars encoding
* hash.c (get_env_cstr): environment variables must be ASCII compatible, as dummy encodings and wide char encodings are unsupproted now. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50344 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
5c0df05b92
commit
adfeb95c87
3 changed files with 47 additions and 9 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Sun Apr 19 10:42:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* hash.c (get_env_cstr): environment variables must be ASCII
|
||||||
|
compatible, as dummy encodings and wide char encodings are
|
||||||
|
unsupproted now.
|
||||||
|
|
||||||
Sat Apr 18 15:18:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Sat Apr 18 15:18:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* ext/json/parser/parser.rl: raise with messages in UTF-8
|
* ext/json/parser/parser.rl: raise with messages in UTF-8
|
||||||
|
|
19
hash.c
19
hash.c
|
@ -2699,9 +2699,24 @@ env_str_new2(const char *ptr)
|
||||||
return env_str_new(ptr, strlen(ptr));
|
return env_str_new(ptr, strlen(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
get_env_cstr(VALUE str, const char *name)
|
||||||
|
{
|
||||||
|
char *var;
|
||||||
|
rb_encoding *enc = rb_enc_get(str);
|
||||||
|
if (!rb_enc_asciicompat(enc)) {
|
||||||
|
rb_raise(rb_eArgError, "bad environment variable %s: ASCII incompatible encoding: %s",
|
||||||
|
name, rb_enc_name(enc));
|
||||||
|
}
|
||||||
|
var = RSTRING_PTR(str);
|
||||||
|
if (memchr(var, '\0', RSTRING_LEN(str))) {
|
||||||
|
rb_raise(rb_eArgError, "bad environment variable %s: contains null byte", name);
|
||||||
|
}
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
#define get_env_ptr(var, val) \
|
#define get_env_ptr(var, val) \
|
||||||
(memchr((var = RSTRING_PTR(val)), '\0', RSTRING_LEN(val)) ? \
|
(var = get_env_cstr(val, #var))
|
||||||
rb_raise(rb_eArgError, "bad environment variable " #var) : (void)0)
|
|
||||||
|
|
||||||
static inline const char *
|
static inline const char *
|
||||||
env_name(volatile VALUE *s)
|
env_name(volatile VALUE *s)
|
||||||
|
|
|
@ -3,6 +3,23 @@ require 'test/unit'
|
||||||
class TestEnv < Test::Unit::TestCase
|
class TestEnv < Test::Unit::TestCase
|
||||||
IGNORE_CASE = /bccwin|mswin|mingw/ =~ RUBY_PLATFORM
|
IGNORE_CASE = /bccwin|mswin|mingw/ =~ RUBY_PLATFORM
|
||||||
PATH_ENV = "PATH"
|
PATH_ENV = "PATH"
|
||||||
|
INVALID_ENVVARS = [
|
||||||
|
"foo\0bar",
|
||||||
|
"\xa1\xa1".force_encoding(Encoding::UTF_16LE),
|
||||||
|
"foo".force_encoding(Encoding::ISO_2022_JP),
|
||||||
|
]
|
||||||
|
|
||||||
|
def assert_invalid_env(msg = nil)
|
||||||
|
failed = {}
|
||||||
|
INVALID_ENVVARS.select do |v|
|
||||||
|
begin
|
||||||
|
assert_raise(ArgumentError) {yield v}
|
||||||
|
rescue MiniTest::Assertion => e
|
||||||
|
failed[v] = e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assert(failed.empty?, message(msg) {mu_pp(failed)})
|
||||||
|
end
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
@verbose = $VERBOSE
|
@verbose = $VERBOSE
|
||||||
|
@ -87,13 +104,13 @@ class TestEnv < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_delete
|
def test_delete
|
||||||
assert_raise(ArgumentError) { ENV.delete("foo\0bar") }
|
assert_invalid_env {|v| ENV.delete(v)}
|
||||||
assert_nil(ENV.delete("TEST"))
|
assert_nil(ENV.delete("TEST"))
|
||||||
assert_nothing_raised { ENV.delete(PATH_ENV) }
|
assert_nothing_raised { ENV.delete(PATH_ENV) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_getenv
|
def test_getenv
|
||||||
assert_raise(ArgumentError) { ENV["foo\0bar"] }
|
assert_invalid_env {|v| ENV[v]}
|
||||||
ENV[PATH_ENV] = ""
|
ENV[PATH_ENV] = ""
|
||||||
assert_equal("", ENV[PATH_ENV])
|
assert_equal("", ENV[PATH_ENV])
|
||||||
assert_nil(ENV[""])
|
assert_nil(ENV[""])
|
||||||
|
@ -110,7 +127,7 @@ class TestEnv < Test::Unit::TestCase
|
||||||
assert_equal("foo", ENV.fetch("test", "foo"))
|
assert_equal("foo", ENV.fetch("test", "foo"))
|
||||||
assert_equal("bar", ENV.fetch("test") { "bar" })
|
assert_equal("bar", ENV.fetch("test") { "bar" })
|
||||||
assert_equal("bar", ENV.fetch("test", "foo") { "bar" })
|
assert_equal("bar", ENV.fetch("test", "foo") { "bar" })
|
||||||
assert_raise(ArgumentError) { ENV.fetch("foo\0bar") }
|
assert_invalid_env {|v| ENV.fetch(v)}
|
||||||
assert_nothing_raised { ENV.fetch(PATH_ENV, "foo") }
|
assert_nothing_raised { ENV.fetch(PATH_ENV, "foo") }
|
||||||
ENV[PATH_ENV] = ""
|
ENV[PATH_ENV] = ""
|
||||||
assert_equal("", ENV.fetch(PATH_ENV))
|
assert_equal("", ENV.fetch(PATH_ENV))
|
||||||
|
@ -119,8 +136,8 @@ class TestEnv < Test::Unit::TestCase
|
||||||
def test_aset
|
def test_aset
|
||||||
assert_nothing_raised { ENV["test"] = nil }
|
assert_nothing_raised { ENV["test"] = nil }
|
||||||
assert_equal(nil, ENV["test"])
|
assert_equal(nil, ENV["test"])
|
||||||
assert_raise(ArgumentError) { ENV["foo\0bar"] = "test" }
|
assert_invalid_env {|v| ENV[v] = "test"}
|
||||||
assert_raise(ArgumentError) { ENV["test"] = "foo\0bar" }
|
assert_invalid_env {|v| ENV["test"] = v}
|
||||||
|
|
||||||
begin
|
begin
|
||||||
# setenv(3) allowed the name includes '=',
|
# setenv(3) allowed the name includes '=',
|
||||||
|
@ -276,7 +293,7 @@ class TestEnv < Test::Unit::TestCase
|
||||||
assert_not_send([ENV, :has_key?, "test"])
|
assert_not_send([ENV, :has_key?, "test"])
|
||||||
ENV["test"] = "foo"
|
ENV["test"] = "foo"
|
||||||
assert_send([ENV, :has_key?, "test"])
|
assert_send([ENV, :has_key?, "test"])
|
||||||
assert_raise(ArgumentError) { ENV.has_key?("foo\0bar") }
|
assert_invalid_env {|v| ENV.has_key?(v)}
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_assoc
|
def test_assoc
|
||||||
|
@ -290,7 +307,7 @@ class TestEnv < Test::Unit::TestCase
|
||||||
assert_equal("test", k)
|
assert_equal("test", k)
|
||||||
assert_equal("foo", v)
|
assert_equal("foo", v)
|
||||||
end
|
end
|
||||||
assert_raise(ArgumentError) { ENV.assoc("foo\0bar") }
|
assert_invalid_env {|v| ENV.assoc(v)}
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_has_value2
|
def test_has_value2
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue