зеркало из https://github.com/github/ruby.git
* hash.c (ruby_setenv): raise if putenv and SetEnvironmentVariable
failed, because of the restriction of the size on Windows. based on a patch from Peter Weldon at [ruby-core:32304]. fix: Bug#3812, [ruby-core:32250] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29225 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
073e6ccc7b
Коммит
da47bbd1db
|
@ -1,3 +1,10 @@
|
||||||
|
Sat Sep 11 16:47:41 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* hash.c (ruby_setenv): raise if putenv and SetEnvironmentVariable
|
||||||
|
failed, because of the restriction of the size on Windows.
|
||||||
|
based on a patch from Peter Weldon at [ruby-core:32304]. fix:
|
||||||
|
Bug#3812, [ruby-core:32250]
|
||||||
|
|
||||||
Sat Sep 11 15:19:57 2010 Eric Hodel <drbrain@segment7.net>
|
Sat Sep 11 15:19:57 2010 Eric Hodel <drbrain@segment7.net>
|
||||||
|
|
||||||
* lib/webrick/httpauth/digestauth.rb (WEBrick::Config::DigestAuth):
|
* lib/webrick/httpauth/digestauth.rb (WEBrick::Config::DigestAuth):
|
||||||
|
|
29
hash.c
29
hash.c
|
@ -2139,29 +2139,28 @@ void
|
||||||
ruby_setenv(const char *name, const char *value)
|
ruby_setenv(const char *name, const char *value)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
int len;
|
VALUE buf;
|
||||||
char *buf;
|
int failed = 0;
|
||||||
if (strchr(name, '=')) {
|
if (strchr(name, '=')) {
|
||||||
|
fail:
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
rb_sys_fail("ruby_setenv");
|
rb_sys_fail("ruby_setenv");
|
||||||
}
|
}
|
||||||
if (value) {
|
if (value) {
|
||||||
len = strlen(name) + 1 + strlen(value) + 1;
|
buf = rb_sprintf("%s=%s", name, value);
|
||||||
buf = ALLOCA_N(char, len);
|
|
||||||
snprintf(buf, len, "%s=%s", name, value);
|
|
||||||
putenv(buf);
|
|
||||||
|
|
||||||
/* putenv() doesn't handle empty value */
|
|
||||||
if (!*value)
|
|
||||||
SetEnvironmentVariable(name,value);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
len = strlen(name) + 1 + 1;
|
buf = rb_sprintf("%s=", name);
|
||||||
buf = ALLOCA_N(char, len);
|
|
||||||
snprintf(buf, len, "%s=", name);
|
|
||||||
putenv(buf);
|
|
||||||
SetEnvironmentVariable(name, 0);
|
|
||||||
}
|
}
|
||||||
|
failed = putenv(RSTRING_PTR(buf));
|
||||||
|
/* even if putenv() failed, clean up and try to delete the
|
||||||
|
* variable from the system area. */
|
||||||
|
rb_str_resize(buf, 0);
|
||||||
|
if (!value || !*value) {
|
||||||
|
/* putenv() doesn't handle empty value */
|
||||||
|
if (!SetEnvironmentVariable(name,value)) goto fail;
|
||||||
|
}
|
||||||
|
if (failed) goto fail;
|
||||||
#elif defined(HAVE_SETENV) && defined(HAVE_UNSETENV)
|
#elif defined(HAVE_SETENV) && defined(HAVE_UNSETENV)
|
||||||
#undef setenv
|
#undef setenv
|
||||||
#undef unsetenv
|
#undef unsetenv
|
||||||
|
|
|
@ -374,4 +374,16 @@ class TestEnv < Test::Unit::TestCase
|
||||||
ENV.update({"baz"=>"quux","a"=>"b"}) {|k, v1, v2| v1 ? k + "_" + v1 + "_" + v2 : v2 }
|
ENV.update({"baz"=>"quux","a"=>"b"}) {|k, v1, v2| v1 ? k + "_" + v1 + "_" + v2 : v2 }
|
||||||
check(ENV.to_hash.to_a, [%w(foo bar), %w(baz baz_qux_quux), %w(a b)])
|
check(ENV.to_hash.to_a, [%w(foo bar), %w(baz baz_qux_quux), %w(a b)])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_huge_value
|
||||||
|
huge_value = "bar" * 40960
|
||||||
|
ENV["foo"] = "bar"
|
||||||
|
if /mswin|mingw/ =~ RUBY_PLATFORM
|
||||||
|
assert_raise(Errno::EINVAL) { ENV["foo"] = huge_value }
|
||||||
|
assert_equal("bar", ENV["foo"])
|
||||||
|
else
|
||||||
|
assert_nothing_raised { ENV["foo"] = huge_value }
|
||||||
|
assert_equal(huge_value, ENV["foo"])
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -29,7 +29,7 @@ class TestRequire < Test::Unit::TestCase
|
||||||
INPUT
|
INPUT
|
||||||
|
|
||||||
begin
|
begin
|
||||||
assert_in_out_err(["-S", "foo/" * 10000 + "foo"], "") do |r, e|
|
assert_in_out_err(["-S", "foo/" * 2500 + "foo"], "") do |r, e|
|
||||||
assert_equal([], r)
|
assert_equal([], r)
|
||||||
assert_operator(2, :<=, e.size)
|
assert_operator(2, :<=, e.size)
|
||||||
assert_equal("openpath: pathname too long (ignored)", e.first)
|
assert_equal("openpath: pathname too long (ignored)", e.first)
|
||||||
|
@ -48,19 +48,24 @@ class TestRequire < Test::Unit::TestCase
|
||||||
|
|
||||||
def test_require_path_home
|
def test_require_path_home
|
||||||
env_rubypath, env_home = ENV["RUBYPATH"], ENV["HOME"]
|
env_rubypath, env_home = ENV["RUBYPATH"], ENV["HOME"]
|
||||||
|
pathname_too_long = /pathname too long \(ignored\).*\(LoadError\)/m
|
||||||
|
|
||||||
ENV["RUBYPATH"] = "~"
|
ENV["RUBYPATH"] = "~"
|
||||||
ENV["HOME"] = "/foo" * 10000
|
ENV["HOME"] = "/foo" * 2500
|
||||||
assert_in_out_err(%w(-S test_ruby_test_require), "", [], /^.+$/)
|
assert_in_out_err(%w(-S test_ruby_test_require), "", [], pathname_too_long)
|
||||||
|
|
||||||
ENV["RUBYPATH"] = "~" + "/foo" * 10000
|
ENV["RUBYPATH"] = "~" + "/foo" * 2500
|
||||||
ENV["HOME"] = "/foo"
|
ENV["HOME"] = "/foo"
|
||||||
assert_in_out_err(%w(-S test_ruby_test_require), "", [], /^.+$/)
|
assert_in_out_err(%w(-S test_ruby_test_require), "", [], pathname_too_long)
|
||||||
|
|
||||||
t = Tempfile.new(["test_ruby_test_require", ".rb"])
|
t = Tempfile.new(["test_ruby_test_require", ".rb"])
|
||||||
t.puts "p :ok"
|
t.puts "p :ok"
|
||||||
t.close
|
t.close
|
||||||
|
|
||||||
ENV["RUBYPATH"] = "~"
|
ENV["RUBYPATH"] = "~"
|
||||||
|
ENV["HOME"] = t.path
|
||||||
|
assert_in_out_err(%w(-S test_ruby_test_require), "", [], /\(LoadError\)/)
|
||||||
|
|
||||||
ENV["HOME"], name = File.split(t.path)
|
ENV["HOME"], name = File.split(t.path)
|
||||||
assert_in_out_err(["-S", name], "", %w(:ok), [])
|
assert_in_out_err(["-S", name], "", %w(:ok), [])
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче