From: "H.Yamamoto" Date: 2005-06-10T18:28:12+09:00 Subject: [ruby-dev:26328] Re: ruby_setenv dumps core with mod_ruby/1.4.2 山本です。 たぶん、条件文は万が一にも origenviron な文字列を free しないようにする セーフガードだと思うので、すでに if (!value) { if (environ != origenviron) { のブロックにあるようにするのが意図された動作ではないかと思います。 下のパッチは、リファクタリングして共通部分をまとめてみたものです。 Index: hash.c =================================================================== RCS file: /src/ruby/hash.c,v retrieving revision 1.128.2.11 diff -u -w -b -p -r1.128.2.11 hash.c --- hash.c 28 Feb 2005 02:45:20 -0000 1.128.2.11 +++ hash.c 10 Jun 2005 09:22:23 -0000 @@ -1837,26 +1837,22 @@ ruby_setenv(name, value) tmpenv[max] = 0; environ = tmpenv; /* tell exec where it is now */ } - if (!value) { - if (environ != origenviron) { + if (environ[i]) { char **envp = origenviron; while (*envp && *envp != environ[i]) envp++; if (!*envp) free(environ[i]); - } + if (!value) { while (environ[i]) { environ[i] = environ[i+1]; i++; } return; } - if (!environ[i]) { /* does not exist yet */ + } + else { /* does not exist yet */ REALLOC_N(environ, char*, i+2); /* just expand it a bit */ environ[i+1] = 0; /* make sure it's null terminated */ - } - else { - if (environ[i] != origenviron[i]) - free(environ[i]); } environ[i] = ALLOC_N(char, strlen(name) + strlen(value) + 2); #ifndef MSDOS