diff options
author | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-01-11 13:58:59 +0000 |
---|---|---|
committer | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-01-11 13:58:59 +0000 |
commit | 217a4bd2838f2daab8ec9b812317a40ae7a16ab4 (patch) | |
tree | 9a430490585cbf002cc25f2edae6195b43ac04dc /hash.c | |
parent | 8c801be9bf3ad71e2f24f665978bd209a45f13c0 (diff) |
* hash.c (ruby_setenv): Improve the emulatation of setenv(3) on
environments where putenv(3) is used. Raise EINVAL If a
variable name contains an '='.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26286 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r-- | hash.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -2045,6 +2045,10 @@ ruby_setenv(const char *name, const char *value) #if defined(_WIN32) int len; char *buf; + if (strchr(name, '=')) { + errno = EINVAL; + rb_sys_fail("ruby_setenv"); + } if (value) { len = strlen(name) + 1 + strlen(value) + 1; buf = ALLOCA_N(char, len); @@ -2072,8 +2076,13 @@ ruby_setenv(const char *name, const char *value) rb_sys_fail("unsetenv"); } #elif defined __sun__ - size_t len = strlen(name); + size_t len; char **env_ptr, *str; + if (strchr(name, '=')) { + errno = EINVAL; + rb_sys_fail("ruby_setenv"); + } + len = strlen(name); for (env_ptr = GET_ENVIRON(environ); (str = *env_ptr) != 0; ++env_ptr) { if (!strncmp(str, name, len) && str[len] == '=') { if (!in_origenv(str)) free(str); @@ -2089,7 +2098,12 @@ ruby_setenv(const char *name, const char *value) } #else /* WIN32 */ size_t len; - int i=envix(name); /* where does it go? */ + int i; + if (strchr(name, '=')) { + errno = EINVAL; + rb_sys_fail("ruby_setenv"); + } + i=envix(name); /* where does it go? */ if (environ == origenviron) { /* need we copy environment? */ int j; |