diff --git a/7.3.109 b/7.3.109 new file mode 100644 index 0000000..ce35fb0 --- /dev/null +++ b/7.3.109 @@ -0,0 +1,266 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.109 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +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@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 ///