0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

updated for version 7.3.990

Problem:    Memory leak in new regexp engine.
Solution:   Jump to end of function to free memory. (Dominique Pelle)
This commit is contained in:
Bram Moolenaar 2013-05-21 16:28:11 +02:00
parent 12e4014092
commit b09d983c78
2 changed files with 23 additions and 18 deletions

View File

@ -2143,6 +2143,7 @@ post2nfa(postfix, end, nfa_calc_size)
nfa_state_T *s; nfa_state_T *s;
nfa_state_T *s1; nfa_state_T *s1;
nfa_state_T *matchstate; nfa_state_T *matchstate;
nfa_state_T *ret = NULL;
if (postfix == NULL) if (postfix == NULL)
return NULL; return NULL;
@ -2211,7 +2212,7 @@ post2nfa(postfix, end, nfa_calc_size)
e1 = POP(); e1 = POP();
s = new_state(NFA_SPLIT, e1.start, e2.start); s = new_state(NFA_SPLIT, e1.start, e2.start);
if (s == NULL) if (s == NULL)
return NULL; goto theend;
PUSH(frag(s, append(e1.out, e2.out))); PUSH(frag(s, append(e1.out, e2.out)));
break; break;
@ -2225,7 +2226,7 @@ post2nfa(postfix, end, nfa_calc_size)
e = POP(); e = POP();
s = new_state(NFA_SPLIT, e.start, NULL); s = new_state(NFA_SPLIT, e.start, NULL);
if (s == NULL) if (s == NULL)
return NULL; goto theend;
patch(e.out, s); patch(e.out, s);
PUSH(frag(s, list1(&s->out1))); PUSH(frag(s, list1(&s->out1)));
break; break;
@ -2240,7 +2241,7 @@ post2nfa(postfix, end, nfa_calc_size)
e = POP(); e = POP();
s = new_state(NFA_SPLIT, e.start, NULL); s = new_state(NFA_SPLIT, e.start, NULL);
if (s == NULL) if (s == NULL)
return NULL; goto theend;
PUSH(frag(s, append(e.out, list1(&s->out1)))); PUSH(frag(s, append(e.out, list1(&s->out1))));
break; break;
@ -2254,7 +2255,7 @@ post2nfa(postfix, end, nfa_calc_size)
e = POP(); e = POP();
s = new_state(NFA_SPLIT, NULL, e.start); s = new_state(NFA_SPLIT, NULL, e.start);
if (s == NULL) if (s == NULL)
return NULL; goto theend;
PUSH(frag(s, append(e.out, list1(&s->out)))); PUSH(frag(s, append(e.out, list1(&s->out))));
break; break;
@ -2268,7 +2269,7 @@ post2nfa(postfix, end, nfa_calc_size)
e = POP(); e = POP();
s = new_state(NFA_SPLIT, e.start, NULL); s = new_state(NFA_SPLIT, e.start, NULL);
if (s == NULL) if (s == NULL)
return NULL; goto theend;
patch(e.out, s); patch(e.out, s);
PUSH(frag(e.start, list1(&s->out1))); PUSH(frag(e.start, list1(&s->out1)));
break; break;
@ -2283,7 +2284,7 @@ post2nfa(postfix, end, nfa_calc_size)
} }
s = new_state(NFA_SKIP_CHAR, NULL, NULL); s = new_state(NFA_SKIP_CHAR, NULL, NULL);
if (s == NULL) if (s == NULL)
return NULL; goto theend;
PUSH(frag(s, list1(&s->out))); PUSH(frag(s, list1(&s->out)));
break; break;
@ -2293,7 +2294,7 @@ post2nfa(postfix, end, nfa_calc_size)
* END_INVISIBLE, similarly to MOPEN. * END_INVISIBLE, similarly to MOPEN.
*/ */
/* TODO: Maybe this drops the speed? */ /* TODO: Maybe this drops the speed? */
return NULL; goto theend;
if (nfa_calc_size == TRUE) if (nfa_calc_size == TRUE)
{ {
@ -2303,12 +2304,12 @@ post2nfa(postfix, end, nfa_calc_size)
e = POP(); e = POP();
s1 = new_state(NFA_END_INVISIBLE, NULL, NULL); s1 = new_state(NFA_END_INVISIBLE, NULL, NULL);
if (s1 == NULL) if (s1 == NULL)
return NULL; goto theend;
patch(e.out, s1); patch(e.out, s1);
s = new_state(NFA_START_INVISIBLE, e.start, s1); s = new_state(NFA_START_INVISIBLE, e.start, s1);
if (s == NULL) if (s == NULL)
return NULL; goto theend;
PUSH(frag(s, list1(&s1->out))); PUSH(frag(s, list1(&s1->out)));
break; break;
@ -2357,10 +2358,10 @@ post2nfa(postfix, end, nfa_calc_size)
{ {
s = new_state(mopen, NULL, NULL); s = new_state(mopen, NULL, NULL);
if (s == NULL) if (s == NULL)
return NULL; goto theend;
s1 = new_state(mclose, NULL, NULL); s1 = new_state(mclose, NULL, NULL);
if (s1 == NULL) if (s1 == NULL)
return NULL; goto theend;
patch(list1(&s->out), s1); patch(list1(&s->out), s1);
PUSH(frag(s, list1(&s1->out))); PUSH(frag(s, list1(&s1->out)));
break; break;
@ -2371,11 +2372,11 @@ post2nfa(postfix, end, nfa_calc_size)
e = POP(); e = POP();
s = new_state(mopen, e.start, NULL); /* `(' */ s = new_state(mopen, e.start, NULL); /* `(' */
if (s == NULL) if (s == NULL)
return NULL; goto theend;
s1 = new_state(mclose, NULL, NULL); /* `)' */ s1 = new_state(mclose, NULL, NULL); /* `)' */
if (s1 == NULL) if (s1 == NULL)
return NULL; goto theend;
patch(e.out, s1); patch(e.out, s1);
if (mopen == NFA_MULTIBYTE || mopen == NFA_COMPOSING) if (mopen == NFA_MULTIBYTE || mopen == NFA_COMPOSING)
@ -2397,7 +2398,7 @@ post2nfa(postfix, end, nfa_calc_size)
} }
s = new_state(*p, NULL, NULL); s = new_state(*p, NULL, NULL);
if (s == NULL) if (s == NULL)
return NULL; goto theend;
PUSH(frag(s, list1(&s->out))); PUSH(frag(s, list1(&s->out)));
break; break;
@ -2408,7 +2409,7 @@ post2nfa(postfix, end, nfa_calc_size)
if (nfa_calc_size == TRUE) if (nfa_calc_size == TRUE)
{ {
nstate++; nstate++;
return NULL; /* Return value when counting size is ignored anyway */ goto theend; /* Return value when counting size is ignored anyway */
} }
e = POP(); e = POP();
@ -2418,14 +2419,16 @@ post2nfa(postfix, end, nfa_calc_size)
if (istate >= nstate) if (istate >= nstate)
EMSG_RET_NULL(_("E876: (NFA regexp) Not enough space to store the whole NFA ")); 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 = &state_ptr[istate++]; /* the match state */
matchstate->c = NFA_MATCH; matchstate->c = NFA_MATCH;
matchstate->out = matchstate->out1 = NULL; matchstate->out = matchstate->out1 = NULL;
patch(e.out, matchstate); patch(e.out, matchstate);
return e.start; ret = e.start;
theend:
vim_free(stack);
return ret;
#undef POP1 #undef POP1
#undef PUSH1 #undef PUSH1

View File

@ -728,6 +728,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
990,
/**/ /**/
989, 989,
/**/ /**/