| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.109 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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; |
| } |
| |
| |
| |
| *** 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 /// |