https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2008-07-03T15:52:33Z
Ruby Issue Tracking System
Ruby 1.8 - Bug #214: $0に長い文字列を入れるとpsの出力に環境変数らしきものが出てくる
https://bugs.ruby-lang.org/issues/214?journal_id=337
2008-07-03T15:52:33Z
znz (Kazuhiro NISHIYAMA)
<ul></ul><p>=begin<br>
西山和広です。</p>
<p>At Wed, 2 Jul 2008 14:12:14 +0900,<br>
takeru sasaki wrote:</p>
<blockquote>
<p>$0に長い文字列を入れるとpsの出力に環境変数らしきものが出てきます。</p>
<p>Macで発生しますが、Linuxでは発生しませんでした。<br>
macでruby1.9でも発生しませんでした。</p>
</blockquote>
<p>IRCでなかむら(う)さんが作成したパッチをちょっと直した以下のパッチで<br>
直るようです。</p>
<p>1.9の方はruby.c:ruby_sysinitでmallocしたものがorigarg.argvに<br>
入っていて、本当のargvが書き換わっていないようです。</p>
<a name="Index-rubyc"></a>
<h1 >Index: ruby.c<a href="#Index-rubyc" class="wiki-anchor">¶</a></h1>
<p>--- ruby.c (リビジョン 17840)<br>
+++ ruby.c (作業コピー)<br>
@@ -1039,6 +1039,39 @@ set_arg0space()<br>
#define set_arg0space() ((void)0)<br>
#endif</p>
<p>+static int<br>
+get_arglen(int argc, char **argv)<br>
+{</p>
<ul>
<li>char *s = argv[0];</li>
<li>int i;</li>
<li>
<li>if (!argc) return 0;</li>
<li>s += strlen(s);</li>
<li>/* See if all the arguments are contiguous in memory */</li>
<li>for (i = 1; i < argc; i++) {</li>
<li>if (argv[i] == s + 1) {</li>
<li>
<pre><code> s++;
</code></pre>
</li>
<li>
<pre><code> s += strlen(s); /* this one is ok too */
</code></pre>
</li>
<li>}</li>
<li>else {</li>
<li>
<pre><code> break;
</code></pre>
</li>
<li>}</li>
<li>}<br>
+#if defined(USE_ENVSPACE_FOR_ARG0)</li>
<li>if (environ && (s == environ[0])) {</li>
<li>s += strlen(s);</li>
<li>for (i = 1; environ[i]; i++) {</li>
<li>
<pre><code> if (environ[i] == s + 1) {
</code></pre>
</li>
<li>
<pre><code> s++;
</code></pre>
</li>
<li>
<pre><code> s += strlen(s); /* this one is ok too */
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>}</li>
<li>ruby_setenv("", NULL); /* duplicate environ vars */</li>
<li>}<br>
+#endif</li>
<li>return s - argv[0];<br>
+}</li>
<li>
</ul>
<p>static void<br>
set_arg0(val, id)<br>
VALUE val;<br>
@@ -1047,8 +1080,9 @@ set_arg0(val, id)<br>
VALUE progname;<br>
char *s;<br>
long i;</p>
<ul>
<li>int j;<br>
#if !defined(PSTAT_SETCMD) && !defined(HAVE_SETPROCTITLE)</li>
</ul>
<ul>
<li>static int len;</li>
</ul>
<ul>
<li>
<p>static int len = 0;<br>
#endif</p>
<p>if (origargv == 0) rb_raise(rb_eRuntimeError, "$0 not initialized");<br>
@@ -1075,27 +1109,7 @@ set_arg0(val, id)<br>
progname = rb_tainted_str_new(s, i);<br>
#else<br>
if (len == 0) {</p>
</li>
</ul>
<ul>
<li>char *s = origargv[0];</li>
<li>int i;</li>
<li>
<li>s += strlen(s);</li>
<li>/* See if all the arguments are contiguous in memory */</li>
<li>for (i = 1; i < origargc; i++) {</li>
<li>
<pre><code> if (origargv[i] == s + 1) {
</code></pre>
</li>
<li>
<pre><code> s++;
</code></pre>
</li>
<li>
<pre><code> s += strlen(s); /* this one is ok too */
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> else {
</code></pre>
</li>
<li>
<pre><code> break;
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>}<br>
-#if defined(USE_ENVSPACE_FOR_ARG0)</li>
<li>if (s + 1 == envspace.begin) {</li>
<li>
<pre><code> s = envspace.end;
</code></pre>
</li>
<li>
<pre><code> ruby_setenv("", NULL); /* duplicate environ vars */
</code></pre>
</li>
<li>}<br>
-#endif</li>
<li>len = s - origargv[0];</li>
</ul>
<ul>
<li>
<p>len = get_arglen(origargc, origargv);<br>
}</p>
<p>if (i >= len) {<br>
@@ -1105,8 +1119,10 @@ set_arg0(val, id)<br>
s = origargv[0] + i;<br>
*s = '\0';<br>
if (++i < len) memset(s + 1, ' ', len - i);</p>
</li>
</ul>
<ul>
<li>for (i = 1; i < origargc; i++)</li>
<li>origargv[i] = s;</li>
</ul>
<ul>
<li>for (i = len, j = origargc-1; j > 0 && i > 0; --i, --j) {</li>
<li>origargv[j] = origargv[0] + i - 1;</li>
<li>*origargv[j] = '\0';</li>
<li>}<br>
progname = rb_tainted_str_new2(origargv[0]);<br>
#endif<br>
rb_progname = rb_obj_freeze(progname);</li>
</ul>
<p>--<br>
|ZnZ(ゼット エヌ ゼット)<br>
|西山和広(Kazuhiro NISHIYAMA)</p>
<p>=end</p>
Ruby 1.8 - Bug #214: $0に長い文字列を入れるとpsの出力に環境変数らしきものが出てくる
https://bugs.ruby-lang.org/issues/214?journal_id=338
2008-07-03T19:47:04Z
Anonymous
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>=begin<br>
Applied in changeset r17849.<br>
=end</p>