diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-10-28 14:10:11 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-10-28 14:10:11 +0000 |
commit | 4d5571fbf12335b872bb9579395bd37ca47d33ea (patch) | |
tree | 96052fcc9cc87bd4adfcdc0f4cea182d6470c978 /regparse.c | |
parent | f8c39639e54e6a326662b7b0e2f47bc2ff8d2c74 (diff) | |
download | ruby-4d5571fbf12335b872bb9579395bd37ca47d33ea.tar.gz ruby-4d5571fbf12335b872bb9579395bd37ca47d33ea.tar.xz ruby-4d5571fbf12335b872bb9579395bd37ca47d33ea.zip |
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
<ralfjunker AT gmx.de> at [ruby-core:24921].
--
* regparse.c: commit miss.
--
* regparse.c: commit miss again.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_9_1@25531 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'regparse.c')
-rw-r--r-- | regparse.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/regparse.c b/regparse.c index 87008221f..35b6c33e7 100644 --- a/regparse.c +++ b/regparse.c @@ -1,3 +1,4 @@ +/* -*- mode:c; c-file-style:"gnu" -*- */ /********************************************************************** 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(&anode, tok, &p, end, env); - if (r != 0) goto cc_open_err; - acc = NCCLASS(anode); - r = or_cclass(cc, acc, env->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->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, &p, end, env); if (r < 0) return r; r = parse_subexp(&target, tok, term, &p, end, env); - if (r < 0) return r; + if (r < 0) { + onig_node_free(target); + return r; + } if (NTYPE(*np) == NT_ANCHOR) NANCHOR(*np)->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->type; - break; + *np = node_new_empty(); + return tok->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 < 0) return r; r = parse_subexp(&target, tok, term, src, end, env); env->option = prev; - if (r < 0) return r; - NENCLOSE(*np)->target = target; + if (r < 0) { + onig_node_free(target); + return r; + } + NENCLOSE(*np)->target = target; return tok->type; } break; @@ -5386,7 +5390,7 @@ parse_exp(Node** np, OnigToken* tok, int term, NQTFR(qn)->greedy = tok->u.repeat.greedy; r = set_quantifier(qn, *targetp, group, env); if (r < 0) return r; - + if (tok->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(&node, tok, term, src, end, env); - if (r < 0) return r; + if (r < 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 = &(NCDR(*top)); while (r != TK_EOT && r != term && r != TK_ALT) { r = parse_exp(&node, tok, term, src, end, env); - if (r < 0) return r; + if (r < 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 < 0) return r; r = parse_branch(&node, tok, term, src, end, env); - if (r < 0) return r; + if (r < 0) { + onig_node_free(node); + return r; + } *headp = onig_node_new_alt(node, NULL); headp = &(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; |