[#42564] [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — Makoto Kishimoto <redmine@...>

Feature #4043: =E3=82=B0=E3=83=AD=E3=83=BC=E3=83=90=E3=83=AB=E9=96=A2=E6=95=

15 messages 2010/11/11
[#42774] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — Yukihiro Matsumoto <matz@...> 2010/12/16

まつもと ゆきひろです

[#42834] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp> 2010/12/21

きしもとです

[#42835] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — Yukihiro Matsumoto <matz@...> 2010/12/21

まつもと ゆきひろです

[#42838] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp> 2010/12/21

きしもとです

[#42845] Re: [Ruby 1.9-Feature#4043][Open] グローバル関数current_classの提案 — Yukihiro Matsumoto <matz@...> 2010/12/21

まつもと ゆきひろです

[#42577] Rubyのバグレポートのガイドライン — "Shota Fukumori (sora_h)" <sorah@...>

sora_hです。

11 messages 2010/11/15
[#42588] Re: Rubyのバグレポートのガイドライン — Yugui <yugui@...> 2010/11/18

2010/11/15 Shota Fukumori (sora_h) <sorah@tubusu.net>:

[#42638] Enumerable#categorize — Tanaka Akira <akr@...>

enumerable から hash を生成するメソッドとして

25 messages 2010/11/27
[#42643] Re: Enumerable#categorize — Yukihiro Matsumoto <matz@...> 2010/11/27

まつもと ゆきひろです

[ruby-dev:42579] [Ruby 1.9-Bug#4061][Open] char class may cause memory leak

From: Yusuke Endoh <redmine@...>
Date: 2010-11-15 15:20:37 UTC
List: ruby-dev #42579
Bug #4061: char class may cause memory leak
http://redmine.ruby-lang.org/issues/show/4061

起票者: Yusuke Endoh
ステータス: Open, 優先度: Normal
担当者: Yusuke Endoh
ruby -v: ruby 1.9.3dev (2010-11-15 trunk 29800) [i686-linux]

遠藤です。

以下のようにするとメモリリークによってメモリ消費量がじわじわと増えていきます。
Coverity Scan が見つけてくれました。

  a = (0..8000).map {|n| (n * 4    ).chr("UTF-8") }
  b = (0..8000).map {|n| (n * 4 + 2).chr("UTF-8") }
  loop do
    begin
      /[[#{ a }]||[#{ b }]]/
    rescue RegexpError
    end
  end


diff --git a/regparse.c b/regparse.c
index 2caab90..bf40603 100644
--- a/regparse.c
+++ b/regparse.c
@@ -2006,7 +2006,7 @@ and_cclass(CClassNode* dest, CClassNode* cc, ScanEnv* env)
 {
   OnigEncoding enc = env->enc;
   int r, not1, not2;
-  BBuf *buf1, *buf2, *pbuf;
+  BBuf *buf1, *buf2, *pbuf = 0;
   BitSetRef bsr1, bsr2;
   BitSet bs1, bs2;
 
@@ -2041,17 +2041,16 @@ and_cclass(CClassNode* dest, CClassNode* cc, ScanEnv* env)
     else {
       r = and_code_range_buf(buf1, not1, buf2, not2, &pbuf, env);
       if (r == 0 && not1 != 0) {
-	BBuf *tbuf;
+	BBuf *tbuf = 0;
 	r = not_code_range_buf(enc, pbuf, &tbuf, env);
-	if (r != 0) {
-	  bbuf_free(pbuf);
-	  return r;
-	}
 	bbuf_free(pbuf);
 	pbuf = tbuf;
       }
     }
-    if (r != 0) return r;
+    if (r != 0) {
+	bbuf_free(pbuf);
+	return r;
+    }
 
     dest->mbuf = pbuf;
     bbuf_free(buf1);
@@ -2065,7 +2064,7 @@ or_cclass(CClassNode* dest, CClassNode* cc, ScanEnv* env)
 {
   OnigEncoding enc = env->enc;
   int r, not1, not2;
-  BBuf *buf1, *buf2, *pbuf;
+  BBuf *buf1, *buf2, *pbuf = 0;
   BitSetRef bsr1, bsr2;
   BitSet bs1, bs2;
 
@@ -2100,17 +2099,16 @@ or_cclass(CClassNode* dest, CClassNode* cc, ScanEnv* env)
     else {
       r = or_code_range_buf(enc, buf1, not1, buf2, not2, &pbuf, env);
       if (r == 0 && not1 != 0) {
-	BBuf *tbuf;
+	BBuf *tbuf = 0;
 	r = not_code_range_buf(enc, pbuf, &tbuf, env);
-	if (r != 0) {
-	  bbuf_free(pbuf);
-	  return r;
-	}
 	bbuf_free(pbuf);
 	pbuf = tbuf;
       }
     }
-    if (r != 0) return r;
+    if (r != 0) {
+	bbuf_free(pbuf);
+	return r;
+    }
 
     dest->mbuf = pbuf;
     bbuf_free(buf1);

-- 
Yusuke Endoh <mame@tsg.ne.jp>


----------------------------------------
http://redmine.ruby-lang.org

In This Thread

Prev Next