Bug #3825
ENV.delete raise Exception on Windows
Description
=begin
ENV.delete raises Invalid argument Exception on Windows.
The error is due to trying SetEnvironmentVariable even if putenv succeeded.
C:>ruby -ve "ENV['foo']='bar';ENV.delete('foo')"
ruby 1.9.3dev (2010-09-12 trunk 29234) [i386-mswin32_90]
-e:1:in delete': Invalid argument - ruby_setenv (Errno::EINVAL)
'
from -e:1:in
The patch is simple as like this:
--- hash.c.org 2010-09-13 11:31:01.000000000 +0900
+++ hash.c 2010-09-13 11:51:08.000000000 +0900
@@ -2156,7 +2156,7 @@
/* even if putenv() failed, clean up and try to delete the
* variable from the system area. */
rb_str_resize(buf, 0);
- if (!value || !*value) {
- if (failed && (!value || !value)) { / putenv() doesn't handle empty value */ if (!SetEnvironmentVariable(name,value)) goto fail; } =end
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
=begin
Hi,
At Mon, 13 Sep 2010 12:05:11 +0900,
Heesob Park wrote in [ruby-core:32353]:
ENV.delete raises Invalid argument Exception on Windows.
The error is due to trying SetEnvironmentVariable even if putenv succeeded.
Does test/ruby/test_env.rb fail now? I can't check it now.
--
Nobu Nakada
=end
Updated by phasis68 (Heesob Park) over 10 years ago
=begin
Hi,
2010/9/13 Nobuyoshi Nakada nobu@ruby-lang.org:
Hi,
At Mon, 13 Sep 2010 12:05:11 +0900,
Heesob Park wrote in [ruby-core:32353]:ENV.delete raises Invalid argument Exception on Windows.
The error is due to trying SetEnvironmentVariable even if putenv succeeded.
Does test/ruby/test_env.rb fail now? I can't check it now.
On Windows XP Home SP3:
Test run options: --seed 1488
Loaded suite test_env
Started
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Finished in 0.156250 seconds.
1) Error:
test_aset(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
2) Error:
test_assoc(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
3) Error:
test_bracket(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:11:in delete'
setup'
test_env.rb:11:in
4) Error:
test_bracket(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
5) Error:
test_clear(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:223:in clear'
test_clear'
test_env.rb:223:in
6) Error:
test_clear(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
7) Failure:
test_delete(TestEnv) [test_env.rb:92]:
Exception raised:
<#>.
8) Error:
test_delete(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
9) Error:
test_each_key(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
10) Error:
test_each_pair(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
11) Error:
test_each_value(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
12) Error:
test_empty_p(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:269:in clear'
test_empty_p'
test_env.rb:269:in
13) Error:
test_empty_p(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
14) Error:
test_fetch(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:104:in delete'
test_fetch'
test_env.rb:104:in
15) Error:
test_fetch(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
16) Error:
test_getenv(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
17) Error:
test_has_key(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
18) Error:
test_has_value(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:11:in delete'
setup'
test_env.rb:11:in
19) Error:
test_has_value(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
20) Error:
test_has_value2(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:297:in clear'
test_has_value2'
test_env.rb:297:in
21) Error:
test_has_value2(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
22) Error:
test_huge_value(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
23) Error:
test_inspect(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:232:in clear'
test_inspect'
test_env.rb:232:in
24) Error:
test_inspect(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
25) Error:
test_invert(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:352:in clear'
test_invert'
test_env.rb:352:in
26) Error:
test_invert(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
27) Error:
test_key(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
28) Error:
test_keys(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:11:in delete'
setup'
test_env.rb:11:in
29) Error:
test_keys(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
30) Error:
test_rassoc(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:304:in clear'
test_rassoc'
test_env.rb:304:in
31) Error:
test_rassoc(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
32) Error:
test_rehash(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
33) Error:
test_reject(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
34) Error:
test_reject_bang(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:11:in delete'
setup'
test_env.rb:11:in
35) Error:
test_reject_bang(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
36) Error:
test_replace(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:360:in replace'
test_replace'
test_env.rb:360:in
37) Error:
test_replace(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
38) Error:
test_select(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
39) Error:
test_select_bang(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:11:in delete'
setup'
test_env.rb:11:in
40) Error:
test_select_bang(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
41) Error:
test_shift(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:342:in clear'
test_shift'
test_env.rb:342:in
42) Error:
test_shift(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
43) Error:
test_size(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
44) Error:
test_to_a(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:11:in delete'
setup'
test_env.rb:11:in
45) Error:
test_to_a(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
46) Error:
test_to_hash(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
47) Error:
test_to_s(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
48) Error:
test_update(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:365:in clear'
test_update'
test_env.rb:365:in
49) Error:
test_update(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
50) Error:
test_values(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
51) Error:
test_values_at(TestEnv):
Errno::EINVAL: Invalid argument - ruby_setenv
test_env.rb:17:in clear'
teardown'
test_env.rb:17:in
34 tests, 209 assertions, 1 failures, 50 errors, 0 skips
Test run options: --seed 1488
BTW, On Windows 7, it works fine:
Test run options: --seed 34498
Loaded suite test_env
Started
..................................
Finished in 0.454000 seconds.
34 tests, 391 assertions, 0 failures, 0 errors, 0 skips
Test run options: --seed 34498
Regards,
Park Heesob
=end
Updated by pweldon (Peter Weldon) over 10 years ago
=begin
Knowing the value of GetLastError() after SetEnvironmentVariable() fails may give a clue. Can you try get that?
In VS, I would, add "$err,hr" to my watch window and put a break point at the fail: label in hash.c (setenv).
=end
Updated by phasis68 (Heesob Park) over 10 years ago
=begin
2010/9/14 Peter Weldon redmine@ruby-lang.org:
Issue #3825 has been updated by Peter Weldon.
Knowing the value of GetLastError() after SetEnvironmentVariable() fails may give a clue. Can you try get that?
In VS, I would, add "$err,hr" to my watch window and put a break point at the fail: label in hash.c (setenv).
The value of GetLastError() is 203 and which defined as
#define ERROR_ENVVAR_NOT_FOUND 203
I am not sure in which case, SetEnvironmentVariable() with null value fails.
The another possible patch is
--- hash.c 2010-09-14 09:47:12.000000000 +0900
+++ hash.c.new 2010-09-14 09:47:12.000000000 +0900
@@ -2158,7 +2158,7 @@
rb_str_resize(buf, 0);
if (!value || !value) {
/ putenv() doesn't handle empty value */
- if (!SetEnvironmentVariable(name,value)) goto fail;
- if (!SetEnvironmentVariable(name,value) && GetLastError() != ERROR_ENVVAR_NOT_FOUND) goto fail; } if (failed) goto fail; #elif defined(HAVE_SETENV) && defined(HAVE_UNSETENV)
=end
Updated by shyouhei (Shyouhei Urabe) over 10 years ago
- Status changed from Open to Assigned
- Assignee set to usa (Usaku NAKAMURA)
=begin
=end
Updated by phasis68 (Heesob Park) over 10 years ago
=begin
I confirmed this issue occurs on Windows 2000, XP, 2003.
Is there any specific reason for this issue not fixed?
=end
Updated by usa (Usaku NAKAMURA) over 10 years ago
=begin
Does this occur in trunk?
Though I cannot reproduce.
=end
Updated by phasis68 (Heesob Park) over 10 years ago
=begin
2010/9/30 Usaku NAKAMURA redmine@ruby-lang.org:
Issue #3825 has been updated by Usaku NAKAMURA.
Does this occur in trunk?
Though I cannot reproduce.
Yes, it occur in trunk on Windows XP. I know it does not occur on Windows 7.
C:>ruby -ve "ENV['foo']='bar';ENV.delete('foo')"
ruby 1.9.3dev (2010-09-28 trunk 29354) [i386-mswin32_90]
-e:1:in delete': Invalid argument - ruby_setenv (Errno::EINVAL)
'
from -e:1:in
=end
Updated by usa (Usaku NAKAMURA) over 10 years ago
=begin
Hello,
In message "[ruby-core:32647] Re: [Ruby 1.9-Bug#3825] ENV.delete raise Exception on Windows"
on Sep.30,2010 10:31:34, phasis@gmail.com wrote:
Yes, it occur in trunk on Windows XP. I know it does not occur on Windows 7.
Oh, I see.
Just merged your patch. thanks!
Regards,
--
U.Nakamura usa@garbagecollect.jp
=end
Updated by usa (Usaku NAKAMURA) over 10 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
=begin
This issue was solved with changeset r29377.
Heesob, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
=end