<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,3 +1,9 @@
+Sun Aug 16 10:45:10 2009  Nobuyoshi Nakada  &lt;nobu@ruby-lang.org&gt;
+
+	* regparse.c (parse_char_class, parse_exp, parse_branch),
+	  (parse_subexp): fixed memory leak.  a patch from Ralf Junker
+	  &lt;ralfjunker AT gmx.de&gt; at [ruby-core:24921].
+
 Sun Aug 16 01:10:00 2009  NARUSE, Yui  &lt;naruse@ruby-lang.org&gt;
 
 	* regparse.c (add_ctype_to_cc_by_range): fix the first</diff>
      <filename>ChangeLog</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
+/* -*- mode:c; c-file-style:&quot;gnu&quot; -*- */
 /**********************************************************************
   regparse.c -  Oniguruma (regular expression library)
 **********************************************************************/
@@ -4403,12 +4404,11 @@ parse_char_class(Node** np, OnigToken* tok, UChar** src, UChar* end,
 	CClassNode* acc;
 
 	r = parse_char_class(&amp;anode, tok, &amp;p, end, env);
-	if (r != 0) goto cc_open_err;
-	acc = NCCLASS(anode);
-	r = or_cclass(cc, acc, env-&gt;enc);
-
+	if (r == 0) {
+	  acc = NCCLASS(anode);
+	  r = or_cclass(cc, acc, env);
+	}
 	onig_node_free(anode);
-      cc_open_err:
 	if (r != 0) goto err;
       }
       break;
@@ -4497,7 +4497,6 @@ parse_char_class(Node** np, OnigToken* tok, UChar** src, UChar* end,
  err:
   if (cc != NCCLASS(*np))
     bbuf_free(cc-&gt;mbuf);
-  onig_node_free(*np);
   return r;
 }
 
@@ -4731,7 +4730,10 @@ parse_enclose(Node** np, OnigToken* tok, int term, UChar** src, UChar* end,
   r = fetch_token(tok, &amp;p, end, env);
   if (r &lt; 0) return r;
   r = parse_subexp(&amp;target, tok, term, &amp;p, end, env);
-  if (r &lt; 0) return r;
+  if (r &lt; 0) {
+    onig_node_free(target);
+    return r;
+  }
 
   if (NTYPE(*np) == NT_ANCHOR)
     NANCHOR(*np)-&gt;target = target;
@@ -5054,9 +5056,8 @@ parse_exp(Node** np, OnigToken* tok, int term,
   case TK_ALT:
   case TK_EOT:
   end_of_token:
-  *np = node_new_empty();
-  return tok-&gt;type;
-  break;
+    *np = node_new_empty();
+    return tok-&gt;type;
 
   case TK_SUBEXP_OPEN:
     r = parse_enclose(np, tok, TK_SUBEXP_CLOSE, src, end, env);
@@ -5071,8 +5072,11 @@ parse_exp(Node** np, OnigToken* tok, int term,
       if (r &lt; 0) return r;
       r = parse_subexp(&amp;target, tok, term, src, end, env);
       env-&gt;option = prev;
-      if (r &lt; 0) return r;
-      NENCLOSE(*np)-&gt;target = target;	
+      if (r &lt; 0) {
+	onig_node_free(target);
+	return r;
+      }
+      NENCLOSE(*np)-&gt;target = target;
       return tok-&gt;type;
     }
     break;
@@ -5386,7 +5390,7 @@ parse_exp(Node** np, OnigToken* tok, int term,
       NQTFR(qn)-&gt;greedy = tok-&gt;u.repeat.greedy;
       r = set_quantifier(qn, *targetp, group, env);
       if (r &lt; 0) return r;
-      
+
       if (tok-&gt;u.repeat.possessive != 0) {
 	Node* en;
 	en = node_new_enclose(ENCLOSE_STOP_BACKTRACK);
@@ -5429,7 +5433,10 @@ parse_branch(Node** top, OnigToken* tok, int term,
 
   *top = NULL;
   r = parse_exp(&amp;node, tok, term, src, end, env);
-  if (r &lt; 0) return r;
+  if (r &lt; 0) {
+    onig_node_free(node);
+    return r;
+  }
 
   if (r == TK_EOT || r == term || r == TK_ALT) {
     *top = node;
@@ -5439,7 +5446,10 @@ parse_branch(Node** top, OnigToken* tok, int term,
     headp = &amp;(NCDR(*top));
     while (r != TK_EOT &amp;&amp; r != term &amp;&amp; r != TK_ALT) {
       r = parse_exp(&amp;node, tok, term, src, end, env);
-      if (r &lt; 0) return r;
+      if (r &lt; 0) {
+	onig_node_free(node);
+	return r;
+      }
 
       if (NTYPE(node) == NT_LIST) {
 	*headp = node;
@@ -5481,7 +5491,10 @@ parse_subexp(Node** top, OnigToken* tok, int term,
       r = fetch_token(tok, src, end, env);
       if (r &lt; 0) return r;
       r = parse_branch(&amp;node, tok, term, src, end, env);
-      if (r &lt; 0) return r;
+      if (r &lt; 0) {
+	onig_node_free(node);
+	return r;
+      }
 
       *headp = onig_node_new_alt(node, NULL);
       headp = &amp;(NCDR(*headp));
@@ -5491,6 +5504,7 @@ parse_subexp(Node** top, OnigToken* tok, int term,
       goto err;
   }
   else {
+    onig_node_free(node);
   err:
     if (term == TK_SUBEXP_CLOSE)
       return ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;</diff>
      <filename>regparse.c</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 #define RUBY_VERSION &quot;1.9.1&quot;
-#define RUBY_PATCHLEVEL 291
+#define RUBY_PATCHLEVEL 292
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 9
 #define RUBY_VERSION_TEENY 1</diff>
      <filename>version.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>7d6b25443a10bc141da730fb46a9883de9bc00be</id>
    </parent>
  </parents>
  <author>
    <name>yugui</name>
    <email>yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
  </author>
  <url>http://github.com/yugui/ruby/commit/192cd9cffe0a8f419b858fe7c8628cfb1eea3118</url>
  <id>192cd9cffe0a8f419b858fe7c8628cfb1eea3118</id>
  <committed-date>2009-10-28T07:10:11-07:00</committed-date>
  <authored-date>2009-10-28T07:10:11-07:00</authored-date>
  <message>merges r24550,r24551 and r24552 from trunk into ruby_1_9_1.
--
* regparse.c (parse_char_class, parse_exp, parse_branch),
  (parse_subexp): fixed memory leak.  a patch from Ralf Junker
  &lt;ralfjunker AT gmx.de&gt; at [ruby-core:24921].
--
* regparse.c: commit miss.
--
* regparse.c: commit miss again.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@25531 b2dd03c8-39d4-4d8f-98ff-823fe69b080e</message>
  <tree>96052fcc9cc87bd4adfcdc0f4cea182d6470c978</tree>
  <committer>
    <name>yugui</name>
    <email>yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
  </committer>
</commit>
