From: Akinori MUSHA Date: 2010-01-11T03:42:34+09:00 Subject: [ruby-dev:40023] [Bug:trunk] ENV.[]= should raise an error on failure --pgp-sign-Multipart_Mon_Jan_11_03:34:28_2010-1 Content-Type: text/plain; charset=ISO-2022-JP  現在 ENV.[]= は setenv(3) や putenv(3) の返り値を見ていませんが、 エラーは検知して例外を上げるべきではないでしょうか。  わかりやすい例では ENV["A="] = "1" のように不正な名前の環境変数を 設定しようとすると Error::EINVAL が発生するようになります。 Index: hash.c =================================================================== --- hash.c (revision 26276) +++ hash.c (working copy) @@ -2049,7 +2049,8 @@ ruby_setenv(const char *name, const char len = strlen(name) + 1 + strlen(value) + 1; buf = ALLOCA_N(char, len); snprintf(buf, len, "%s=%s", name, value); - putenv(buf); + if (putenv(buf)) + rb_sys_fail("putenv"); /* putenv() doesn't handle empty value */ if (*value) @@ -2064,10 +2065,13 @@ ruby_setenv(const char *name, const char #elif defined(HAVE_SETENV) && defined(HAVE_UNSETENV) #undef setenv #undef unsetenv - if (value) - setenv(name,value,1); - else - unsetenv(name); + if (value) { + if (setenv(name, value, 1)) + rb_sys_fail("setenv"); + } else { + if (unsetenv(name)) + rb_sys_fail("unsetenv"); + } #elif defined __sun__ size_t len = strlen(name); char **env_ptr, *str; @@ -2081,7 +2085,8 @@ ruby_setenv(const char *name, const char if (value) { str = malloc(len += strlen(value) + 2); snprintf(str, len, "%s=%s", name, value); - putenv(str); + if (putenv(str)) + rb_sys_fail("putenv"); } #else /* WIN32 */ size_t len; -- Akinori MUSHA / http://akinori.org/ --pgp-sign-Multipart_Mon_Jan_11_03:34:28_2010-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (FreeBSD) iEYEABECAAYFAktKHbQACgkQkgvvx5/Z4e71TACfZag/DhGifR3LjoyZe35gID95 WyAAn3GX/OhSF1cs4lZLrTDASe7v6SJw =ZOBf -----END PGP SIGNATURE----- --pgp-sign-Multipart_Mon_Jan_11_03:34:28_2010-1--