diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-04-24 04:06:59 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-04-24 04:06:59 +0000 |
commit | 655b2ade4984f8d0ad6c76d6eff35262ad7d2619 (patch) | |
tree | fec58a80243ab253092002a4175b2549becd45d6 /ruby.c | |
parent | 07311e56e20d6bcbd6272a8568468c91207c6203 (diff) | |
download | ruby-655b2ade4984f8d0ad6c76d6eff35262ad7d2619.tar.gz |
* ruby.c (get_arglen): skip the last terminator of argv before
checking environ.
* ruby.c (get_arglen): duplicate environ area if setenv and unsetenv
are provided.
* ruby.c (set_arg0): keep empty strings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27468 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ruby.c')
-rw-r--r-- | ruby.c | 23 |
1 files changed, 18 insertions, 5 deletions
@@ -1642,7 +1642,7 @@ rb_load_file(const char *fname) } #if !defined(PSTAT_SETCMD) && !defined(HAVE_SETPROCTITLE) -#if !defined(_WIN32) && !(defined(HAVE_SETENV) && defined(HAVE_UNSETENV)) +#if !defined(_WIN32) #define USE_ENVSPACE_FOR_ARG0 #endif @@ -1669,7 +1669,8 @@ get_arglen(int argc, char **argv) } } #if defined(USE_ENVSPACE_FOR_ARG0) - if (environ && (s == environ[0])) { + if (environ && (s+1 == environ[0])) { + s++; s += strlen(s); for (i = 1; environ[i]; i++) { if (environ[i] == s + 1) { @@ -1677,7 +1678,19 @@ get_arglen(int argc, char **argv) s += strlen(s); /* this one is ok too */ } } +# if defined(HAVE_SETENV) && defined(HAVE_UNSETENV) + { + char *t = malloc(s - environ[0] + 1); + for (i = 0; environ[i]; i++) { + size_t len = strlen(environ[i]) + 1; + memcpy(t, environ[i], len); + environ[i] = t; + t += len; + } + } +# else ruby_setenv("", NULL); /* duplicate environ vars */ +# endif } #endif return s - argv[0]; @@ -1712,8 +1725,8 @@ set_arg0(VALUE val, ID id) setproctitle("%.*s", (int)i, s); #else - if ((size_t)i >= origarg.len) { - i = (long)(origarg.len - 1); + if ((size_t)i > origarg.len - origarg.argc) { + i = (long)(origarg.len - origarg.argc); } memcpy(origarg.argv[0], s, i); @@ -1724,7 +1737,7 @@ set_arg0(VALUE val, ID id) *t = '\0'; if ((size_t)(i + 1) < origarg.len) { - memset(t + 1, ' ', origarg.len - i - 1); + memset(t + 1, '\0', origarg.len - i - 1); } for (j = 1; j < origarg.argc; j++) { origarg.argv[j] = t; |