| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.715 |
| 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.715 |
| Problem: Crash when calling setloclist() in BufUnload autocmd. (Marcin |
| Szamotulski) |
| Solution: Set w_llist to NULL when it was freed. Also add a test. |
| (Christian Brabandt) |
| Files: src/quickfix.c, src/testdir/test49.ok, src/testdir/test49.vim |
| |
| |
| |
| |
| |
| *** 107,113 **** |
| }; |
| |
| static int qf_init_ext __ARGS((qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast, char_u *qf_title)); |
| ! static void qf_new_list __ARGS((qf_info_T *qi, char_u *qf_title)); |
| static void ll_free_all __ARGS((qf_info_T **pqi)); |
| static int qf_add_entry __ARGS((qf_info_T *qi, qfline_T **prevp, char_u *dir, char_u *fname, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid)); |
| static qf_info_T *ll_new_list __ARGS((void)); |
| --- 107,113 ---- |
| }; |
| |
| static int qf_init_ext __ARGS((qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast, char_u *qf_title)); |
| ! static void qf_new_list __ARGS((qf_info_T *qi, char_u *qf_title, win_T *wp)); |
| static void ll_free_all __ARGS((qf_info_T **pqi)); |
| static int qf_add_entry __ARGS((qf_info_T *qi, qfline_T **prevp, char_u *dir, char_u *fname, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid)); |
| static qf_info_T *ll_new_list __ARGS((void)); |
| |
| *** 266,272 **** |
| |
| if (newlist || qi->qf_curlist == qi->qf_listcount) |
| /* make place for a new list */ |
| ! qf_new_list(qi, qf_title); |
| else if (qi->qf_lists[qi->qf_curlist].qf_count > 0) |
| /* Adding to existing list, find last entry. */ |
| for (qfprev = qi->qf_lists[qi->qf_curlist].qf_start; |
| --- 266,272 ---- |
| |
| if (newlist || qi->qf_curlist == qi->qf_listcount) |
| /* make place for a new list */ |
| ! qf_new_list(qi, qf_title, curwin); |
| else if (qi->qf_lists[qi->qf_curlist].qf_count > 0) |
| /* Adding to existing list, find last entry. */ |
| for (qfprev = qi->qf_lists[qi->qf_curlist].qf_start; |
| |
| *** 885,893 **** |
| * Prepare for adding a new quickfix list. |
| */ |
| static void |
| ! qf_new_list(qi, qf_title) |
| qf_info_T *qi; |
| char_u *qf_title; |
| { |
| int i; |
| |
| --- 885,894 ---- |
| * Prepare for adding a new quickfix list. |
| */ |
| static void |
| ! qf_new_list(qi, qf_title, wp) |
| qf_info_T *qi; |
| char_u *qf_title; |
| + win_T *wp; |
| { |
| int i; |
| |
| |
| *** 897,903 **** |
| --- 898,908 ---- |
| * way with ":grep'. |
| */ |
| while (qi->qf_listcount > qi->qf_curlist + 1) |
| + { |
| + if (wp != NULL && wp->w_llist == qi) |
| + wp->w_llist = NULL; |
| qf_free(qi, --qi->qf_listcount); |
| + } |
| |
| /* |
| * When the stack is full, remove to oldest entry |
| |
| *** 905,910 **** |
| --- 910,917 ---- |
| */ |
| if (qi->qf_listcount == LISTCOUNT) |
| { |
| + if (wp != NULL && wp->w_llist == qi) |
| + wp->w_llist = NULL; |
| qf_free(qi, 0); |
| for (i = 1; i < LISTCOUNT; ++i) |
| qi->qf_lists[i - 1] = qi->qf_lists[i]; |
| |
| *** 3181,3187 **** |
| eap->cmdidx != CMD_vimgrepadd && eap->cmdidx != CMD_lvimgrepadd) |
| || qi->qf_curlist == qi->qf_listcount) |
| /* make place for a new list */ |
| ! qf_new_list(qi, *eap->cmdlinep); |
| else if (qi->qf_lists[qi->qf_curlist].qf_count > 0) |
| /* Adding to existing list, find last entry. */ |
| for (prevp = qi->qf_lists[qi->qf_curlist].qf_start; |
| --- 3188,3194 ---- |
| eap->cmdidx != CMD_vimgrepadd && eap->cmdidx != CMD_lvimgrepadd) |
| || qi->qf_curlist == qi->qf_listcount) |
| /* make place for a new list */ |
| ! qf_new_list(qi, *eap->cmdlinep, curwin); |
| else if (qi->qf_lists[qi->qf_curlist].qf_count > 0) |
| /* Adding to existing list, find last entry. */ |
| for (prevp = qi->qf_lists[qi->qf_curlist].qf_start; |
| |
| *** 3747,3753 **** |
| |
| if (action == ' ' || qi->qf_curlist == qi->qf_listcount) |
| /* make place for a new list */ |
| ! qf_new_list(qi, title); |
| else if (action == 'a' && qi->qf_lists[qi->qf_curlist].qf_count > 0) |
| /* Adding to existing list, find last entry. */ |
| for (prevp = qi->qf_lists[qi->qf_curlist].qf_start; |
| --- 3754,3760 ---- |
| |
| if (action == ' ' || qi->qf_curlist == qi->qf_listcount) |
| /* make place for a new list */ |
| ! qf_new_list(qi, title, wp); |
| else if (action == 'a' && qi->qf_lists[qi->qf_curlist].qf_count > 0) |
| /* Adding to existing list, find last entry. */ |
| for (prevp = qi->qf_lists[qi->qf_curlist].qf_start; |
| |
| *** 4029,4035 **** |
| #endif |
| |
| /* create a new quickfix list */ |
| ! qf_new_list(qi, *eap->cmdlinep); |
| |
| /* Go through all directories in 'runtimepath' */ |
| p = p_rtp; |
| --- 4036,4042 ---- |
| #endif |
| |
| /* create a new quickfix list */ |
| ! qf_new_list(qi, *eap->cmdlinep, wp); |
| |
| /* Go through all directories in 'runtimepath' */ |
| p = p_rtp; |
| |
| |
| |
| *** 85,92 **** |
| *** Test 83: OK (2835) |
| *** Test 84: OK (934782101) |
| *** Test 85: OK (198689) |
| ! --- Test 86: All tests were run with throwing exceptions on error. |
| The $VIMNOERRTHROW control is not configured. |
| ! --- Test 86: All tests were run with throwing exceptions on interrupt. |
| The $VIMNOINTTHROW control is not configured. |
| ! *** Test 86: OK (50443995) |
| --- 85,94 ---- |
| *** Test 83: OK (2835) |
| *** Test 84: OK (934782101) |
| *** Test 85: OK (198689) |
| ! --- Test 86: No Crash for vimgrep on BufUnload |
| ! *** Test 86: OK (0) |
| ! --- Test 87: All tests were run with throwing exceptions on error. |
| The $VIMNOERRTHROW control is not configured. |
| ! --- Test 87: All tests were run with throwing exceptions on interrupt. |
| The $VIMNOINTTHROW control is not configured. |
| ! *** Test 87: OK (50443995) |
| |
| |
| |
| *** 9603,9611 **** |
| |
| Xcheck 198689 |
| |
| |
| "------------------------------------------------------------------------------- |
| ! " Test 86: $VIMNOERRTHROW and $VIMNOINTTHROW support {{{1 |
| " |
| " It is possible to configure Vim for throwing exceptions on error |
| " or interrupt, controlled by variables $VIMNOERRTHROW and |
| --- 9603,9630 ---- |
| |
| Xcheck 198689 |
| |
| + "------------------------------------------------------------------------------- |
| + " Test 86 setloclist crash {{{1 |
| + " |
| + " Executing a setloclist() on BufUnload shouldn't crash Vim |
| + "------------------------------------------------------------------------------- |
| + |
| + func F |
| + au BufUnload * :call setloclist(0, [{'bufnr':1, 'lnum':1, 'col':1, 'text': 'tango down'}]) |
| + |
| + :lvimgrep /.*/ * |
| + endfunc |
| + |
| + XpathINIT |
| + |
| + ExecAsScript F |
| + |
| + delfunction F |
| + Xout "No Crash for vimgrep on BufUnload" |
| + Xcheck 0 |
| |
| "------------------------------------------------------------------------------- |
| ! " Test 87: $VIMNOERRTHROW and $VIMNOINTTHROW support {{{1 |
| " |
| " It is possible to configure Vim for throwing exceptions on error |
| " or interrupt, controlled by variables $VIMNOERRTHROW and |
| |
| |
| |
| *** 727,728 **** |
| --- 727,730 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 715, |
| /**/ |
| |
| -- |
| One difference between a man and a machine is that a machine is quiet |
| when well oiled. |
| |
| /// 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 /// |