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