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


*** ../vim-7.3.989/src/regexp_nfa.c     2013-05-21 15:33:37.000000000 +0200
--- src/regexp_nfa.c    2013-05-21 16:17:15.000000000 +0200
***************
*** 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
*** ../vim-7.3.989/src/version.c        2013-05-21 15:33:37.000000000 +0200
--- src/version.c       2013-05-21 16:18:03.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
  {   /* Add new patch number below this line */
+ /**/
+     990,
  /**/

-- 
This message contains 78% recycled characters.

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Raspunde prin e-mail lui