Hi Bram,
On Sat, May 27, 2017 at 12:48 PM, Bram Moolenaar <[email protected]> wrote:
>
> Yegappan wrote:
>
>> On Thu, May 4, 2017 at 8:53 PM, Yegappan Lakshmanan <[email protected]>
>> wrote:
>> > Hi,
>> >
>> > On Wed, May 3, 2017 at 1:25 PM, Yegappan Lakshmanan <[email protected]>
>> > wrote:
>> >> Hi Bram,
>> >>
>> >> On Sun, Apr 30, 2017 at 5:21 AM, Bram Moolenaar <[email protected]>
>> >> wrote:
>> >>>
>> >>> Patch 8.0.0590
>> >>> Problem: Cannot add a context to locations.
>> >>> Solution: Add the "context" entry in location entries. (Yegappan
>> >>> Lakshmanan,
>> >>> closes #1012)
>> >>> Files: src/eval.c, src/proto/quickfix.pro, src/quickfix.c,
>> >>> src/testdir/test_quickfix.vim
>> >>>
>> >>
>> >> The setqflist() function only sets the context for the current quickfix
>> >> list.
>> >> Even if the quickfix list number in the stack is specified, it sets the
>> >> context for the current list instead of the specified list. I am
>> >> attaching a
>> >> patch to fix this bug. It also includes additional tests.
>> >>
>> >> Note that the getqflist() function works correctly by returning the
>> >> context for the specified quickfix list.
>> >>
>> >
>> > An updated patch is attached.
>> >
>>
>> Without this patch, the setqflist() function cannot be used to set the
>> context
>> information for a non-current quickfix list. So please include this patch.
>
> Are you sure I didn't include this already?
>
Yes. This patch needs to be applied on top of patch 590. I am attaching
the updated patch.
This patch is needed so that the context of any quickfix list can be changed.
Regards,
Yegappan
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
diff --git a/src/quickfix.c b/src/quickfix.c
index 7b07f9358..0aca4ad0c 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -4877,7 +4877,9 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int action)
/* Use the specified quickfix/location list */
if (di->di_tv.v_type == VAR_NUMBER)
{
- qf_idx = di->di_tv.vval.v_number - 1;
+ /* for zero use the current list */
+ if (di->di_tv.vval.v_number != 0)
+ qf_idx = di->di_tv.vval.v_number - 1;
if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
return FAIL;
}
@@ -4908,11 +4910,11 @@ qf_set_properties(qf_info_T *qi, dict_T *what, int
action)
if ((di = dict_find(what, (char_u *)"context", -1)) != NULL)
{
typval_T *ctx;
- free_tv(qi->qf_lists[qi->qf_curlist].qf_ctx);
+ free_tv(qi->qf_lists[qf_idx].qf_ctx);
ctx = alloc_tv();
if (ctx != NULL)
copy_tv(&di->di_tv, ctx);
- qi->qf_lists[qi->qf_curlist].qf_ctx = ctx;
+ qi->qf_lists[qf_idx].qf_ctx = ctx;
}
return retval;
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim
index f1fd3c97a..51f6a6f7c 100644
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -1804,6 +1804,37 @@ func Xproperty_tests(cchar)
call setloclist(0, [], 'f')
call assert_equal({}, getloclist(0, {'context':1}))
endif
+
+ " Test for changing the context of previous quickfix lists
+ call g:Xsetlist([], 'f')
+ Xexpr "One"
+ Xexpr "Two"
+ Xexpr "Three"
+ call g:Xsetlist([], ' ', {'context' : [1], 'nr' : 1})
+ call g:Xsetlist([], ' ', {'context' : [2], 'nr' : 2})
+ " Also, check for setting the context using quickfix list number zero.
+ call g:Xsetlist([], ' ', {'context' : [3], 'nr' : 0})
+ call test_garbagecollect_now()
+ let l = g:Xgetlist({'nr' : 1, 'context' : 1})
+ call assert_equal([1], l.context)
+ let l = g:Xgetlist({'nr' : 2, 'context' : 1})
+ call assert_equal([2], l.context)
+ let l = g:Xgetlist({'nr' : 3, 'context' : 1})
+ call assert_equal([3], l.context)
+
+ " Test for changing the context through reference and for garbage
+ " collection of quickfix context
+ let l = ["red"]
+ call g:Xsetlist([], ' ', {'context' : l})
+ call add(l, "blue")
+ let x = g:Xgetlist({'context' : 1})
+ call add(x.context, "green")
+ call assert_equal(["red", "blue", "green"], l)
+ call assert_equal(["red", "blue", "green"], x.context)
+ unlet l
+ call test_garbagecollect_now()
+ let m = g:Xgetlist({'context' : 1})
+ call assert_equal(["red", "blue", "green"], m.context)
endfunc
func Test_qf_property()
@@ -2073,3 +2104,19 @@ func Test_qf_free()
call XfreeTests('c')
call XfreeTests('l')
endfunc
+
+" Test for buffer overflow when parsing lines and adding new entries to
+" the quickfix list.
+func Test_bufoverflow()
+ set efm=%f:%l:%m
+ cgetexpr ['File1:100:' . repeat('x', 1025)]
+
+ set efm=%+GCompiler:\ %.%#,%f:%l:%m
+ cgetexpr ['Compiler: ' . repeat('a', 1015), 'File1:10:Hello World']
+
+ set efm=%DEntering\ directory\ %f,%f:%l:%m
+ cgetexpr ['Entering directory ' . repeat('a', 1006),
+ \ 'File1:10:Hello World']
+ set efm&vim
+endfunc
+