To: vim-dev@vim.org Subject: patch 7.1.086 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.1.086 Problem: Crash when using specific Python syntax highlighting. (Quirk) Solution: Check for a negative index, coming from a keyword match at the start of a line from a saved state. Files: src/syntax.c *** ../vim-7.1.085/src/syntax.c Tue Aug 14 23:06:51 2007 --- src/syntax.c Tue Aug 21 17:13:51 2007 *************** *** 279,285 **** */ typedef struct state_item { ! int si_idx; /* index of syntax pattern */ int si_id; /* highlight group ID for keywords */ int si_trans_id; /* idem, transparancy removed */ int si_m_lnum; /* lnum of the match */ --- 279,286 ---- */ typedef struct state_item { ! int si_idx; /* index of syntax pattern or ! KEYWORD_IDX */ int si_id; /* highlight group ID for keywords */ int si_trans_id; /* idem, transparancy removed */ int si_m_lnum; /* lnum of the match */ *************** *** 837,845 **** current_lnum = end_lnum; break; } ! spp = &(SYN_ITEMS(syn_buf)[cur_si->si_idx]); ! found_flags = spp->sp_flags; ! found_match_idx = spp->sp_sync_idx; found_current_lnum = current_lnum; found_current_col = current_col; found_m_endpos = cur_si->si_m_endpos; --- 838,855 ---- current_lnum = end_lnum; break; } ! if (cur_si->si_idx < 0) ! { ! /* Cannot happen? */ ! found_flags = 0; ! found_match_idx = KEYWORD_IDX; ! } ! else ! { ! spp = &(SYN_ITEMS(syn_buf)[cur_si->si_idx]); ! found_flags = spp->sp_flags; ! found_match_idx = spp->sp_sync_idx; ! } found_current_lnum = current_lnum; found_current_col = current_col; found_m_endpos = cur_si->si_m_endpos; *************** *** 2533,2538 **** --- 2543,2552 ---- stateitem_T *sip = &CUR_STATE(idx); synpat_T *spp; + /* This should not happen... */ + if (sip->si_idx < 0) + return; + spp = &(SYN_ITEMS(syn_buf)[sip->si_idx]); if (sip->si_flags & HL_MATCH) sip->si_id = spp->sp_syn_match_id; *************** *** 2648,2653 **** --- 2662,2671 ---- lpos_T end_endpos; int end_idx; + /* return quickly for a keyword */ + if (sip->si_idx < 0) + return; + /* Don't update when it's already done. Can be a match of an end pattern * that started in a previous line. Watch out: can also be a "keepend" * from a containing item. */ *************** *** 2759,2764 **** --- 2777,2786 ---- lpos_T pos; char_u *line; int had_match = FALSE; + + /* just in case we are invoked for a keyword */ + if (idx < 0) + return; /* * Check for being called with a START pattern. *** ../vim-7.1.085/src/version.c Tue Aug 21 15:28:32 2007 --- src/version.c Tue Aug 21 17:21:06 2007 *************** *** 668,669 **** --- 668,671 ---- { /* Add new patch number below this line */ + /**/ + 86, /**/ -- hundred-and-one symptoms of being an internet addict: 222. You send more than 20 personal e-mails a day. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///