Project

General

Profile

Bug #121

SEGV by File.foreach("keywords")

Added by nobu (Nobuyoshi Nakada) over 12 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
Backport:
[ruby-dev:35006]

Description

=begin
なかだです。

At Sun, 8 Jun 2008 00:27:53 +0900,
Tanaka Akira wrote in [ruby-dev:34988]:

以下のようにすると SEGV します。

% ./ruby -ve '
e = File.foreach("keywords")
loop {
p e.next
}
'

手元で再現できないと思ったら、修正してありました。つまり、Cで作
られたEnumeratorがsvarをアクセスするという、test_knownbugs.rbに
すでにいくつかあるテストのバリエーションです。

Index: vm.c
===================================================================
--- vm.c (revision 17037)
+++ vm.c (working copy)
@@ -99,11 +99,12 @@ rb_control_frame_t *
vm_get_ruby_level_cfp(rb_thread_t *th, rb_control_frame_t *cfp)
{

  • while (!RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) {
  • if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
  • return cfp;
  • }
  • if (RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) return 0;
  • while (!RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) { cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
  • if (RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) {
  • return RUBY_VM_NEXT_CONTROL_FRAME(cfp);
  • } }
  • return 0;
  • return cfp; }

@@ -527,4 +528,7 @@ vm_cfp_svar_get(rb_thread_t *th, rb_cont
while (cfp->pc == 0) {
cfp++;

  • if (RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) {
  • return lfp_svar_get(th, 0, key);
  • } } return lfp_svar_get(th, cfp->lfp, key); @@ -536,4 +540,8 @@ vm_cfp_svar_set(rb_thread_t *th, rb_cont while (cfp->pc == 0) { cfp++;
  • if (RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)) {
  • lfp_svar_set(th, 0, key, val);
  • return;
  • } } lfp_svar_set(th, cfp->lfp, key, val); Index: vm_insnhelper.c =================================================================== --- vm_insnhelper.c (revision 17037) +++ vm_insnhelper.c (working copy) @@ -843,21 +843,16 @@ static inline NODE * lfp_svar_place(rb_thread_t *th, VALUE *lfp) {
  • NODE *svar;
  • VALUE *svar;

  • if (th->local_lfp != lfp) {

  • svar = (NODE *)lfp[-1];

  • if ((VALUE)svar == Qnil) {

  •  svar = NEW_IF(Qnil, Qnil, Qnil);
    
  •  lfp[-1] = (VALUE)svar;
    
  • }

  • if (lfp && th->local_lfp != lfp) {

  • svar = &lfp[-1];
    }
    else {

  • svar = (NODE *)th->local_svar;

  • if ((VALUE)svar == Qnil) {

  •  svar = NEW_IF(Qnil, Qnil, Qnil);
    
  •  th->local_svar = (VALUE)svar;
    
  • }

  • svar = &th->local_svar;

  • }

  • if (NIL_P(*svar)) {

  • *svar = (VALUE)NEW_IF(Qnil, Qnil, Qnil);
    }

  • return svar;

  • return (NODE *)*svar;
    }

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


Related issues

Is duplicate of Ruby master - Bug #109: SEGV by File.foreach("keywords")Closedko1 (Koichi Sasada)Actions
#1

Updated by nobu (Nobuyoshi Nakada) over 12 years ago

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

=begin

=end

Also available in: Atom PDF