Loading ...
Sorry, an error occurred while loading the content.

Patch 7.3.109

Expand Messages
  • Bram Moolenaar
    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.
    Message 1 of 1 , Feb 1, 2011
    • 0 Attachment
      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 -- Bram@... -- 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
    Your message has been successfully submitted and would be delivered to recipients shortly.