| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.990 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.990 |
| Problem: Memory leak in new regexp engine. |
| Solution: Jump to end of function to free memory. (Dominique Pelle) |
| Files: src/regexp_nfa.c |
| |
| |
| |
| |
| |
| *** 2143,2148 **** |
| --- 2143,2149 ---- |
| nfa_state_T *s; |
| nfa_state_T *s1; |
| nfa_state_T *matchstate; |
| + nfa_state_T *ret = NULL; |
| |
| if (postfix == NULL) |
| return NULL; |
| |
| *** 2211,2217 **** |
| e1 = POP(); |
| s = new_state(NFA_SPLIT, e1.start, e2.start); |
| if (s == NULL) |
| ! return NULL; |
| PUSH(frag(s, append(e1.out, e2.out))); |
| break; |
| |
| --- 2212,2218 ---- |
| e1 = POP(); |
| s = new_state(NFA_SPLIT, e1.start, e2.start); |
| if (s == NULL) |
| ! goto theend; |
| PUSH(frag(s, append(e1.out, e2.out))); |
| break; |
| |
| |
| *** 2225,2231 **** |
| e = POP(); |
| s = new_state(NFA_SPLIT, e.start, NULL); |
| if (s == NULL) |
| ! return NULL; |
| patch(e.out, s); |
| PUSH(frag(s, list1(&s->out1))); |
| break; |
| --- 2226,2232 ---- |
| e = POP(); |
| s = new_state(NFA_SPLIT, e.start, NULL); |
| if (s == NULL) |
| ! goto theend; |
| patch(e.out, s); |
| PUSH(frag(s, list1(&s->out1))); |
| break; |
| |
| *** 2240,2246 **** |
| e = POP(); |
| s = new_state(NFA_SPLIT, e.start, NULL); |
| if (s == NULL) |
| ! return NULL; |
| PUSH(frag(s, append(e.out, list1(&s->out1)))); |
| break; |
| |
| --- 2241,2247 ---- |
| e = POP(); |
| s = new_state(NFA_SPLIT, e.start, NULL); |
| if (s == NULL) |
| ! goto theend; |
| PUSH(frag(s, append(e.out, list1(&s->out1)))); |
| break; |
| |
| |
| *** 2254,2260 **** |
| e = POP(); |
| s = new_state(NFA_SPLIT, NULL, e.start); |
| if (s == NULL) |
| ! return NULL; |
| PUSH(frag(s, append(e.out, list1(&s->out)))); |
| break; |
| |
| --- 2255,2261 ---- |
| e = POP(); |
| s = new_state(NFA_SPLIT, NULL, e.start); |
| if (s == NULL) |
| ! goto theend; |
| PUSH(frag(s, append(e.out, list1(&s->out)))); |
| break; |
| |
| |
| *** 2268,2274 **** |
| e = POP(); |
| s = new_state(NFA_SPLIT, e.start, NULL); |
| if (s == NULL) |
| ! return NULL; |
| patch(e.out, s); |
| PUSH(frag(e.start, list1(&s->out1))); |
| break; |
| --- 2269,2275 ---- |
| e = POP(); |
| s = new_state(NFA_SPLIT, e.start, NULL); |
| if (s == NULL) |
| ! goto theend; |
| patch(e.out, s); |
| PUSH(frag(e.start, list1(&s->out1))); |
| break; |
| |
| *** 2283,2289 **** |
| } |
| s = new_state(NFA_SKIP_CHAR, NULL, NULL); |
| if (s == NULL) |
| ! return NULL; |
| PUSH(frag(s, list1(&s->out))); |
| break; |
| |
| --- 2284,2290 ---- |
| } |
| s = new_state(NFA_SKIP_CHAR, NULL, NULL); |
| if (s == NULL) |
| ! goto theend; |
| PUSH(frag(s, list1(&s->out))); |
| break; |
| |
| |
| *** 2293,2299 **** |
| * END_INVISIBLE, similarly to MOPEN. |
| */ |
| /* TODO: Maybe this drops the speed? */ |
| ! return NULL; |
| |
| if (nfa_calc_size == TRUE) |
| { |
| --- 2294,2300 ---- |
| * END_INVISIBLE, similarly to MOPEN. |
| */ |
| /* TODO: Maybe this drops the speed? */ |
| ! goto theend; |
| |
| if (nfa_calc_size == TRUE) |
| { |
| |
| *** 2303,2314 **** |
| e = POP(); |
| s1 = new_state(NFA_END_INVISIBLE, NULL, NULL); |
| if (s1 == NULL) |
| ! return NULL; |
| patch(e.out, s1); |
| |
| s = new_state(NFA_START_INVISIBLE, e.start, s1); |
| if (s == NULL) |
| ! return NULL; |
| PUSH(frag(s, list1(&s1->out))); |
| break; |
| |
| --- 2304,2315 ---- |
| e = POP(); |
| s1 = new_state(NFA_END_INVISIBLE, NULL, NULL); |
| if (s1 == NULL) |
| ! goto theend; |
| patch(e.out, s1); |
| |
| s = new_state(NFA_START_INVISIBLE, e.start, s1); |
| if (s == NULL) |
| ! goto theend; |
| PUSH(frag(s, list1(&s1->out))); |
| break; |
| |
| |
| *** 2357,2366 **** |
| { |
| s = new_state(mopen, NULL, NULL); |
| if (s == NULL) |
| ! return NULL; |
| s1 = new_state(mclose, NULL, NULL); |
| if (s1 == NULL) |
| ! return NULL; |
| patch(list1(&s->out), s1); |
| PUSH(frag(s, list1(&s1->out))); |
| break; |
| --- 2358,2367 ---- |
| { |
| s = new_state(mopen, NULL, NULL); |
| if (s == NULL) |
| ! goto theend; |
| s1 = new_state(mclose, NULL, NULL); |
| if (s1 == NULL) |
| ! goto theend; |
| patch(list1(&s->out), s1); |
| PUSH(frag(s, list1(&s1->out))); |
| break; |
| |
| *** 2371,2381 **** |
| e = POP(); |
| s = new_state(mopen, e.start, NULL); /* `(' */ |
| if (s == NULL) |
| ! return NULL; |
| |
| s1 = new_state(mclose, NULL, NULL); /* `)' */ |
| if (s1 == NULL) |
| ! return NULL; |
| patch(e.out, s1); |
| |
| if (mopen == NFA_MULTIBYTE || mopen == NFA_COMPOSING) |
| --- 2372,2382 ---- |
| e = POP(); |
| s = new_state(mopen, e.start, NULL); /* `(' */ |
| if (s == NULL) |
| ! goto theend; |
| |
| s1 = new_state(mclose, NULL, NULL); /* `)' */ |
| if (s1 == NULL) |
| ! goto theend; |
| patch(e.out, s1); |
| |
| if (mopen == NFA_MULTIBYTE || mopen == NFA_COMPOSING) |
| |
| *** 2397,2403 **** |
| } |
| s = new_state(*p, NULL, NULL); |
| if (s == NULL) |
| ! return NULL; |
| PUSH(frag(s, list1(&s->out))); |
| break; |
| |
| --- 2398,2404 ---- |
| } |
| s = new_state(*p, NULL, NULL); |
| if (s == NULL) |
| ! goto theend; |
| PUSH(frag(s, list1(&s->out))); |
| break; |
| |
| |
| *** 2408,2414 **** |
| if (nfa_calc_size == TRUE) |
| { |
| nstate++; |
| ! return NULL; /* Return value when counting size is ignored anyway */ |
| } |
| |
| e = POP(); |
| --- 2409,2415 ---- |
| if (nfa_calc_size == TRUE) |
| { |
| nstate++; |
| ! goto theend; /* Return value when counting size is ignored anyway */ |
| } |
| |
| e = POP(); |
| |
| *** 2418,2431 **** |
| if (istate >= nstate) |
| EMSG_RET_NULL(_("E876: (NFA regexp) Not enough space to store the whole NFA ")); |
| |
| - vim_free(stack); |
| - |
| matchstate = &state_ptr[istate++]; /* the match state */ |
| matchstate->c = NFA_MATCH; |
| matchstate->out = matchstate->out1 = NULL; |
| |
| patch(e.out, matchstate); |
| ! return e.start; |
| |
| #undef POP1 |
| #undef PUSH1 |
| --- 2419,2434 ---- |
| if (istate >= nstate) |
| EMSG_RET_NULL(_("E876: (NFA regexp) Not enough space to store the whole NFA ")); |
| |
| matchstate = &state_ptr[istate++]; /* the match state */ |
| matchstate->c = NFA_MATCH; |
| matchstate->out = matchstate->out1 = NULL; |
| |
| patch(e.out, matchstate); |
| ! ret = e.start; |
| ! |
| ! theend: |
| ! vim_free(stack); |
| ! return ret; |
| |
| #undef POP1 |
| #undef PUSH1 |
| |
| |
| |
| *** 730,731 **** |
| --- 730,733 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 990, |
| /**/ |
| |
| -- |
| This message contains 78% recycled characters. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |