[前][次][番号順一覧][スレッド一覧]

ruby-changes:31606

From: glass <ko1@a...>
Date: Sat, 16 Nov 2013 00:29:29 +0900 (JST)
Subject: [ruby-changes:31606] glass:r43685 (trunk): * eval_jump.c (rb_exec_end_proc): fix double free or corruption error

glass	2013-11-16 00:29:23 +0900 (Sat, 16 Nov 2013)

  New Revision: 43685

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=43685

  Log:
    * eval_jump.c (rb_exec_end_proc): fix double free or corruption error
       when reentering by callcc. [ruby-core:58329] [Bug #9110]
    
     * test/ruby/test_beginendblock.rb: test for above.

  Modified files:
    trunk/ChangeLog
    trunk/eval_jump.c
    trunk/test/ruby/test_beginendblock.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 43684)
+++ ChangeLog	(revision 43685)
@@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sat Nov 16 00:18:36 2013  Masaki Matsushita  <glass.saga@g...>
+
+	* eval_jump.c (rb_exec_end_proc): fix double free or corruption error
+	  when reentering by callcc. [ruby-core:58329] [Bug #9110]
+
+	* test/ruby/test_beginendblock.rb: test for above.
+
 Fri Nov 15 22:21:34 2013  Nobuyoshi Nakada  <nobu@r...>
 
 	* hash.c (hash_foreach_iter, hash_foreach_ensure, rb_hash_foreach):
Index: eval_jump.c
===================================================================
--- eval_jump.c	(revision 43684)
+++ eval_jump.c	(revision 43685)
@@ -97,6 +97,8 @@ void https://github.com/ruby/ruby/blob/trunk/eval_jump.c#L97
 rb_exec_end_proc(void)
 {
     struct end_proc_data *volatile link;
+    struct end_proc_data *ephemeral_end_procs_head = ephemeral_end_procs;
+    struct end_proc_data *end_procs_head = end_procs;
     int status;
     volatile int safe = rb_safe_level();
     rb_thread_t *th = GET_THREAD();
@@ -116,7 +118,6 @@ rb_exec_end_proc(void) https://github.com/ruby/ruby/blob/trunk/eval_jump.c#L118
 	    error_handle(status);
 	    if (!NIL_P(th->errinfo)) errinfo = th->errinfo;
 	}
-	xfree(link);
     }
 
     while (end_procs) {
@@ -133,8 +134,20 @@ rb_exec_end_proc(void) https://github.com/ruby/ruby/blob/trunk/eval_jump.c#L134
 	    error_handle(status);
 	    if (!NIL_P(th->errinfo)) errinfo = th->errinfo;
 	}
+    }
+
+    link = ephemeral_end_procs_head;
+    while (link) {
 	xfree(link);
+	link = link->next;
     }
+
+    link = end_procs_head;
+    while (link) {
+	xfree(link);
+	link = link->next;
+    }
+
     rb_set_safe_level_force(safe);
     th->errinfo = errinfo;
 }
Index: test/ruby/test_beginendblock.rb
===================================================================
--- test/ruby/test_beginendblock.rb	(revision 43684)
+++ test/ruby/test_beginendblock.rb	(revision 43685)
@@ -173,4 +173,16 @@ EOW https://github.com/ruby/ruby/blob/trunk/test/ruby/test_beginendblock.rb#L173
       assert_equal(["", "", 42], [out, err, status.exitstatus], "#{bug5218}: #{ex}")
     end
   end
+
+  def test_callcc_at_exit
+    bug9110 = '[ruby-core:58329][Bug #9110]'
+    ruby = EnvUtil.rubybin
+    script = <<EOS
+require "continuation"
+c = nil
+at_exit { c.call }
+at_exit { callcc {|_c| c = _c } }
+EOS
+    assert system(ruby, "-e", script)
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]