Patch 7.3.109
Problem:    Processing new Esperanto spell file fails and crashes Vim.
            (Dominique Pelle)
Solution:   When running out of memory give an error.  Handle '?' in
            COMPOUNDRULE properly.
Files:      src/spell.c


*** ../vim-7.3.108/src/spell.c  2010-12-17 18:06:00.000000000 +0100
--- src/spell.c 2011-02-01 13:43:52.000000000 +0100
***************
*** 3634,3640 ****
        }
  
        /* Add all flags to "sl_compallflags". */
!       if (vim_strchr((char_u *)"+*[]/", c) == NULL
                && !byte_in_str(slang->sl_compallflags, c))
        {
            *ap++ = c;
--- 3634,3640 ----
        }
  
        /* Add all flags to "sl_compallflags". */
!       if (vim_strchr((char_u *)"?*+[]/", c) == NULL
                && !byte_in_str(slang->sl_compallflags, c))
        {
            *ap++ = c;
***************
*** 3664,3670 ****
        /* Copy flag to "sl_comprules", unless we run into a wildcard. */
        if (crp != NULL)
        {
!           if (c == '+' || c == '*')
            {
                vim_free(slang->sl_comprules);
                slang->sl_comprules = NULL;
--- 3664,3670 ----
        /* Copy flag to "sl_comprules", unless we run into a wildcard. */
        if (crp != NULL)
        {
!           if (c == '?' || c == '+' || c == '*')
            {
                vim_free(slang->sl_comprules);
                slang->sl_comprules = NULL;
***************
*** 3682,3689 ****
        }
        else                /* normal char, "[abc]" and '*' are copied as-is */
        {
!           if (c == '+' || c == '~')
!               *pp++ = '\\';       /* "a+" becomes "a\+" */
  #ifdef FEAT_MBYTE
            if (enc_utf8)
                pp += mb_char2bytes(c, pp);
--- 3682,3689 ----
        }
        else                /* normal char, "[abc]" and '*' are copied as-is */
        {
!           if (c == '?' || c == '+' || c == '~')
!               *pp++ = '\\';       /* "a?" becomes "a\?", "a+" becomes "a\+" */
  #ifdef FEAT_MBYTE
            if (enc_utf8)
                pp += mb_char2bytes(c, pp);
***************
*** 4951,4956 ****
--- 4951,4958 ----
  
      sblock_T  *si_blocks;     /* memory blocks used */
      long      si_blocks_cnt;  /* memory blocks allocated */
+     int               si_did_emsg;    /* TRUE when ran out of memory */
+ 
      long      si_compress_cnt;    /* words to add before lowering
                                       compression limit */
      wordnode_T        *si_first_free; /* List of nodes that have been freed 
during
***************
*** 5477,5497 ****
            }
            else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2))
            {
!               /* Concatenate this string to previously defined ones, using a
!                * slash to separate them. */
!               l = (int)STRLEN(items[1]) + 1;
!               if (compflags != NULL)
!                   l += (int)STRLEN(compflags) + 1;
!               p = getroom(spin, l, FALSE);
!               if (p != NULL)
                {
                    if (compflags != NULL)
                    {
!                       STRCPY(p, compflags);
!                       STRCAT(p, "/");
                    }
-                   STRCAT(p, items[1]);
-                   compflags = p;
                }
            }
            else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2)
--- 5479,5503 ----
            }
            else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2))
            {
!               /* Don't use the first rule if it is a number. */
!               if (compflags != NULL || *skipdigits(items[1]) != NUL)
                {
+                   /* Concatenate this string to previously defined ones,
+                    * using a slash to separate them. */
+                   l = (int)STRLEN(items[1]) + 1;
                    if (compflags != NULL)
+                       l += (int)STRLEN(compflags) + 1;
+                   p = getroom(spin, l, FALSE);
+                   if (p != NULL)
                    {
!                       if (compflags != NULL)
!                       {
!                           STRCPY(p, compflags);
!                           STRCAT(p, "/");
!                       }
!                       STRCAT(p, items[1]);
!                       compflags = p;
                    }
                }
            }
            else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2)
***************
*** 6291,6297 ****
  
      for (p = compflags; *p != NUL; )
      {
!       if (vim_strchr((char_u *)"/*+[]", *p) != NULL)
            /* Copy non-flag characters directly. */
            *tp++ = *p++;
        else
--- 6297,6303 ----
  
      for (p = compflags; *p != NUL; )
      {
!       if (vim_strchr((char_u *)"/?*+[]", *p) != NULL)
            /* Copy non-flag characters directly. */
            *tp++ = *p++;
        else
***************
*** 6320,6326 ****
                    {
                        check_renumber(spin);
                        id = spin->si_newcompID--;
!                   } while (vim_strchr((char_u *)"/+*[]\\-^", id) != NULL);
                    ci->ci_newID = id;
                    hash_add(&aff->af_comp, ci->ci_key);
                }
--- 6326,6332 ----
                    {
                        check_renumber(spin);
                        id = spin->si_newcompID--;
!                   } while (vim_strchr((char_u *)"/?*+[]\\-^", id) != NULL);
                    ci->ci_newID = id;
                    hash_add(&aff->af_comp, ci->ci_key);
                }
***************
*** 7364,7373 ****
  
      if (bl == NULL || bl->sb_used + len > SBLOCKSIZE)
      {
!       /* Allocate a block of memory. This is not freed until much later. */
!       bl = (sblock_T *)alloc_clear((unsigned)(sizeof(sblock_T) + SBLOCKSIZE));
        if (bl == NULL)
            return NULL;
        bl->sb_next = spin->si_blocks;
        spin->si_blocks = bl;
        bl->sb_used = 0;
--- 7370,7390 ----
  
      if (bl == NULL || bl->sb_used + len > SBLOCKSIZE)
      {
!       if (len >= SBLOCKSIZE)
!           bl = NULL;
!       else
!           /* Allocate a block of memory. It is not freed until much later. */
!           bl = (sblock_T *)alloc_clear(
!                                  (unsigned)(sizeof(sblock_T) + SBLOCKSIZE));
        if (bl == NULL)
+       {
+           if (!spin->si_did_emsg)
+           {
+               EMSG(_("E845: Insufficient memory, word list will be 
incomplete"));
+               spin->si_did_emsg = TRUE;
+           }
            return NULL;
+       }
        bl->sb_next = spin->si_blocks;
        spin->si_blocks = bl;
        bl->sb_used = 0;
***************
*** 7382,7387 ****
--- 7399,7405 ----
  
  /*
   * Make a copy of a string into memory allocated with getroom().
+  * Returns NULL when out of memory.
   */
      static char_u *
  getroom_save(spin, s)
***************
*** 7416,7421 ****
--- 7434,7440 ----
  
  /*
   * Allocate the root of a word tree.
+  * Returns NULL when out of memory.
   */
      static wordnode_T *
  wordtree_alloc(spin)
***************
*** 7700,7705 ****
--- 7719,7725 ----
  /*
   * Get a wordnode_T, either from the list of previously freed nodes or
   * allocate a new one.
+  * Returns NULL when out of memory.
   */
      static wordnode_T *
  get_wordnode(spin)
***************
*** 7717,7723 ****
        --spin->si_free_count;
      }
  #ifdef SPELL_PRINTTREE
!     n->wn_nr = ++spin->si_wordnode_nr;
  #endif
      return n;
  }
--- 7737,7744 ----
        --spin->si_free_count;
      }
  #ifdef SPELL_PRINTTREE
!     if (n != NULL)
!       n->wn_nr = ++spin->si_wordnode_nr;
  #endif
      return n;
  }
*** ../vim-7.3.108/src/version.c        2011-02-01 13:48:47.000000000 +0100
--- src/version.c       2011-02-01 13:56:38.000000000 +0100
***************
*** 716,717 ****
--- 716,719 ----
  {   /* Add new patch number below this line */
+ /**/
+     109,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
174. You know what a listserv is.

 /// 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

Raspunde prin e-mail lui