aboutsummaryrefslogtreecommitdiffstats
path: root/hash.c
diff options
context:
space:
mode:
authorknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-11 13:58:59 +0000
committerknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-11 13:58:59 +0000
commit217a4bd2838f2daab8ec9b812317a40ae7a16ab4 (patch)
tree9a430490585cbf002cc25f2edae6195b43ac04dc /hash.c
parent8c801be9bf3ad71e2f24f665978bd209a45f13c0 (diff)
downloadruby-217a4bd2838f2daab8ec9b812317a40ae7a16ab4.tar.gz
* 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.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/hash.c b/hash.c
index ca691f4dd4..9179656b76 100644
--- a/hash.c
+++ b/hash.c
@@ -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;