aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--hash.c18
2 files changed, 22 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index f1fcf1d0f3..444f132123 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon Jan 11 22:45:08 2010 Akinori MUSHA <knu@iDaemons.org>
+
+ * 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 '='.
+
Mon Jan 11 18:16:38 2010 wanabe <s.wanabe@gmail.com>
* vm_insnhelper.h (GET_BLOCK_PTR): return 0 when in class frame.
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;