Bug #2552

HOME 変数を空にして起動すると、再度空にできなくなる

Added by _ wanabe about 5 years ago. Updated almost 4 years ago.

Status:Closed
Priority:Low
Assignee:Usaku NAKAMURA
ruby -v:ruby 1.9.2dev (2010-01-02 trunk 26229) [i386-mingw32] Backport:

Description

=begin
WindowsXP にて、環境変数 HOME が設定されていない状態でインタプリタを起動すると
ENV.delete "HOME" が無効になります。

$ cat test.rb
ENV.delete "HOME"

if ARGV[0]
p ENV["HOME"]
else
system("ruby -v #{$0} child")
end

$ ruby test.rb
ruby 1.9.2dev (2010-01-02 trunk 26229) [i386-mingw32]
"C:/"

init_env() 中の SetEnvironmentVariableW() と ruby_setenv() 中の putenv() で
不整合が起きているようです。
=end

Associated revisions

Revision 26296
Added by Usaku NAKAMURA about 5 years ago

  • win32/win32.c (init_env): use _wputenv() instead of SetEnvironmentVariableW() because latter doesn't set msvcrt's environ work area, of course. [Bug #2552]

Revision 26296
Added by Usaku NAKAMURA about 5 years ago

  • win32/win32.c (init_env): use _wputenv() instead of SetEnvironmentVariableW() because latter doesn't set msvcrt's environ work area, of course. [Bug #2552]

History

#1 Updated by pegacorn jp about 5 years ago

=begin
・putenv()で設定したものは、getenv()でもGetEnvironmentVariable()でも取得できる
・SetEnvironmentVariable()で設定したものは、GetEnvironmentVariable()では取得できるがgetenv()では取得できない

ので、Windows版では必ずGetEnvironmentVariable()で取得するようにした方が良いのではないでしょうか。
# putenv()は既にruby_setenv()に統一されているようなので、
# getenv()もruby_getenv()を作って統一するとか。

=end

#2 Updated by Usaku NAKAMURA about 5 years ago

=begin
元々msvcrtのgetenvは使っていません。
win32/win32.cのrb_w32_getenvを参照してください。

ところで、元の話(HOMEを削除しても子プロセスでは復活している件)ですが、
不整合うんぬんじゃなくて、単にrubyがinit_env()でHOMEが空なら自力で
設定しているせいのような気がしますが、そういう話じゃないですか?
# その挙動が是か非かという議論は歓迎です。
=end

#3 Updated by _ wanabe about 5 years ago

=begin
HOMEを自力で設定していること自体は(少なくともチケット作成時は)
問題と思っていませんでした。
子プロセス起動時に "C:/" が設定されたあと、改めて ENV.delete "HOME" しているのに
これが無視されてしまうことを問題にしています。

蛇足ですが、delete の直前に ENV["HOME"]="foo" などとすると正常に delete されます。
=end

#4 Updated by Usaku NAKAMURA about 5 years ago

=begin
なるほど、現象を誤解していました。
というわけで対応してみました。汚いけど。
=end

#5 Updated by Usaku NAKAMURA about 5 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r26296.
_, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Also available in: Atom PDF