Project

General

Profile

Actions

Bug #705

closed

sample/test.rb:1829: [BUG] Segmentation fault

Added by pegacorn (pegacorn jp) over 15 years ago. Updated almost 13 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
[ruby-dev:37008]

Description

=begin
r19078 以降 SEGV します。

 D:\work\ruby_1_8-r19078\win32>nmake test
 
 Microsoft (R) Program Maintenance Utility   Version 6.00.9782.0
 Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
 
 ./../sample/test.rb:1829: [BUG] Segmentation fault
 ruby 1.8.7 (2008-09-02 revision 19404) [i386-mswin32]
 
 abnormal program termination
 test failed
 NMAKE : fatal error U1077: '.\miniruby.exe' : リターン コード '0x1'
 Stop.

=end

Actions #1

Updated by nobu (Nobuyoshi Nakada) over 15 years ago

=begin
なかだです。

At Sat, 1 Nov 2008 12:52:56 +0900,
pegacorn jp wrote in [ruby-dev:37008]:

r19078 以降 SEGV します。

D:\work\ruby_1_8-r19078\win32>nmake test

Microsoft (R) Program Maintenance Utility   Version 6.00.9782.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

./../sample/test.rb:1829: [BUG] Segmentation fault
ruby 1.8.7 (2008-09-02 revision 19404) [i386-mswin32]

abnormal program termination
test failed
NMAKE : fatal error U1077: '.\miniruby.exe' : リターン コード '0x1'
Stop.

VC6ですよね? とりあえず最新版で試してみたのですが再現できません
でした。VCのデバッガでバックトレースとかとれないでしょうか。

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

=end

Actions #2

Updated by pegacorn (pegacorn jp) over 15 years ago

=begin
Windows 2000(SP4) + VC6(SP6) です。

 msdev ruby.exe -I../lib ./../sample/test.rb

でコールスタックが取れました。

---- ここから
NTDLL! 77f9193c()
NTDLL! 77f9c73e()
NTDLL! 77fb064e()
NTDLL! 77f9bd5a()
NTDLL! 77fcb63e()
MSVCRT! 78001532()
MSVCRT! 780014cf()
st_insert(st_table * 0x02ce1c48, unsigned long 3137, unsigned long 48541080) line 293 + 51 bytes
clone_method() line 70 + 39 bytes
st_foreach(st_table * 0x02a7e140, int (void)* 0x100474c0 clone_method(void), unsigned long 37806436) line 487 + 21 bytes
rb_mod_init_copy(unsigned long 48541400, unsigned long 44819520) line 100 + 21 bytes
rb_class_init_copy(unsigned long 48541400, unsigned long 44819520) line 117 + 13 bytes
rb_call0() line 5906 + 205 bytes
rb_call(unsigned long 44830020, unsigned long 48541400, unsigned long 2969, int 1, const unsigned long * 0x0240e3c0, int 1, unsigned long 6) line 6153 + 37 bytes
vafuncall() line 6230 + 133 bytes
rb_funcall(unsigned long 48541400, unsigned long 2969, int 1) line 6247 + 21 bytes
init_copy() line 188 + 21 bytes
rb_obj_clone(unsigned long 44819520) line 227 + 13 bytes
rb_call0() line 5906 + 178 bytes
rb_call(unsigned long 44829920, unsigned long 44819520, unsigned long 3065, int 0, const unsigned long * 0x00000000, int 0, unsigned long 44824980) line 6153 + 37 bytes
rb_eval(unsigned long 44824980, RNode * 0x02b1f4c0) line 3494 + 186 bytes
rb_eval(unsigned long 44824980, RNode * 0x02aaf8f0) line 3704 + 16 bytes
eval_node() line 1438 + 13 bytes
ruby_exec_internal() line 1643 + 18 bytes
ruby_exec() line 1664
ruby_run() line 1673 + 5 bytes
main() line 51
RUBY! mainCRTStartup + 227 bytes
KERNEL32! 77e789d5()
---- ここまで

この直前は、以下の通りです。

---- ここから
ruby_xmalloc(long 16) line 159 + 5 bytes
st_insert(st_table * 0x02ce1c48, unsigned long 3137, unsigned long 48541080) line 293 + 51 bytes
(後略)
---- ここまで

=end

Actions #3

Updated by pegacorn (pegacorn jp) over 15 years ago

=begin
r19078 の変更で、
marshal_load が、load_ensure で解放した領域を使用するようになって
ヒープを破壊しています。

 static VALUE
 load_ensure(arg)
     struct load_arg *arg;
 {
     if (!DATA_PTR(arg->wrapper)) return 0;
     st_free_table(arg->symbols);
     st_free_table(arg->data);		/* <-- ここで解放 */
     DATA_PTR(arg->wrapper) = 0;
     arg->wrapper = 0;
     return 0;
 }
 
 static VALUE
 marshal_load(argc, argv)
     int argc;
     VALUE *argv;
 {
     (省略)
     v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
     RBASIC(arg.data)->klass = rb_cHash;	/* <-- ここで使用 */
 
     return v;
 }

=end

Actions #4

Updated by nobu (Nobuyoshi Nakada) over 15 years ago

=begin
なかだです。

At Mon, 3 Nov 2008 09:33:54 +0900,
pegacorn jp wrote in [ruby-dev:37016]:

r19078 の変更で、
marshal_load が、load_ensure で解放した領域を使用するようになって
ヒープを破壊しています。

というかarg.dataはもうHashではないのでmarshal_loadのほうが消し忘
れですね。

    RBASIC(arg.data)->klass = rb_cHash;	/* <-- ここで使用 */

この行を消したら解決しますか?

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

=end

Actions #5

Updated by pegacorn (pegacorn jp) over 15 years ago

=begin

    RBASIC(arg.data)->klass = rb_cHash;	/* <-- ここで使用 */

この行を消したら解決しますか?

はい。SEGV しなくなりました。

 D:\work\ruby_1_8-r19078\win32>nmake test
 
 Microsoft (R) Program Maintenance Utility   Version 6.00.9782.0
 Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
 
 test succeeded

=end

Actions #6

Updated by nobu (Nobuyoshi Nakada) over 15 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
Applied in changeset r20097.
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0