[#23332] to_str再考 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

15 messages 2004/04/05

[#23380] [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

17 messages 2004/04/15
[#23400] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。落ちる場所がわかりました。

[#23402] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。

[#23403] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — nobu.nakada@... 2004/04/16

なかだです。

[#23405] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。

[#23407] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。

[ruby-dev:23417] Re: [SEGV] make test-all (bccwin32 ruby1.9.0)

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2004-04-20 08:51:15 UTC
List: ruby-dev #23417
山本です。SEGVの原因がわかりました。

/////////////////////////////
// 2 Mar 2004

E:\ruby-cvs\ruby-temp\ruby>miniruby -e "p system('miniruby -v')"
ruby 1.9.0 (2004-03-01) [i386-bccwin32]
true

/////////////////////////////
// 3 Mar 2004

E:\ruby-cvs\ruby-temp\ruby>miniruby -e "p system('miniruby -v')"
ruby 1.9.0 (2004-03-02) [i386-bccwin32]
-e:1: [BUG] Segmentation fault
ruby 1.9.0 (2004-03-02) [i386-bccwin32]


Abnormal program termination

////////////////////////////
// Change

U ruby/ChangeLog
U ruby/io.c
U ruby/process.c
U ruby/version.h
U ruby/lib/scanf.rb
U ruby/lib/drb/extservm.rb
U ruby/lib/rdoc/diagram.rb
U ruby/lib/rdoc/generators/chm_generator.rb
U ruby/lib/rdoc/ri/ri_display.rb
U ruby/test/ruby/test_iterator.rb
U ruby/test/scanf/data.txt
U ruby/test/scanf/test_scanf.rb
U ruby/test/scanf/test_scanfblocks.rb
U ruby/test/scanf/test_scanfio.rb
U ruby/win32/Makefile.sub
U ruby/win32/win32.c
U ruby/wince/Makefile.sub

この日に process.c が変更されているのですが、

    prog = rb_check_argv(argc, argv);

    if (!prog && argc == 1) {
	--argc;
	prog = *argv++;
    }

    /* 中略 */

    if (prog) argv[0] = prog;

となっていて、rb_check_argv をした後に !prog && argc == 1 だと
argv が無効なポインタを指すので、argv[0] への代入でメモリを壊して
いるのだと思います。

下のようにすれば SEGV はしなくなります。(これが意図された挙動かどうかは
わかりません)

Index: process.c
===================================================================
RCS file: /ruby/ruby/process.c,v
retrieving revision 1.104
diff -u -w -b -p -r1.104 process.c
--- process.c	15 Apr 2004 15:02:00 -0000	1.104
+++ process.c	20 Apr 2004 08:48:30 -0000
@@ -1547,7 +1547,7 @@ rb_spawn(argc, argv)
     earg.argv = argv;
     earg.prog = prog ? RSTRING(prog)->ptr : 0;
     status = rb_fork(&status, (int (*)_((void*)))rb_exec, &earg);
-    if (prog) argv[0] = prog;
+    if (prog && argc) argv[0] = prog;
 #elif defined HAVE_SPAWNV
     if (!argc) {
 	status = proc_spawn(RSTRING(prog)->ptr);
@@ -1555,9 +1555,9 @@ rb_spawn(argc, argv)
     else {
 	status = proc_spawn_n(argc, argv, prog);
     }
-    if (prog) argv[0] = prog;
+    if (prog && argc) argv[0] = prog;
 #else
-    if (prog) argv[0] = prog;
+    if (prog && argc) argv[0] = prog;
     prog = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" "));
     status = system(StringValuePtr(prog));
 # if defined(__human68k__) || defined(__DJGPP__)



In This Thread