Re: Patch 8.1.0261

2018-08-11 Fir de Conversatie Bram Moolenaar


Yegappan wrote:

> >> In all the places where qf_restore_list() is currently invoked, there
> >> is a call to
> >> qflist_valid() to check whether the list with the specified id is
> >> present or not.
> >> If the list is not present, then qf_restore_list() is not called. But
> >> in the future,
> >> someone might call qf_restore_list() without first checking whether the 
> >> list
> >> is still present in the stack or not.
> >
> > Yes, so the current construction is brittle, if someone makes changes
> > and forgets to call qflist_valid() then things break.  That's basically
> > what Coverity complains about: unless you are careful qf_curlist becomes
> > negative.
> >
> > We should move qflist_valid() into qf_restore_list(), and let it return
> > FAIL when the list isn't valid.
> >
> 
> There is no need to call qflist_valid() in qf_restore_list() as the qf_id2nr()
> function (called by qf_restore_list()) already iterates through all the lists
> in the stack.
> 
> >
> > Then the caller must deal with the
> > failure.  This also applies to qf_jump_first() indirectly.
> >
> > Can you make it work like that?
> 
> I am attaching a patch that does this.

Thanks!

-- 
BRIDGEKEEPER: What is your favorite colour?
GAWAIN:   Blue ...  No yelloww!
 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- b...@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///

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Patch 8.1.0261

2018-08-10 Fir de Conversatie Yegappan Lakshmanan
Hi Bram,

On Fri, Aug 10, 2018 at 7:45 AM, Bram Moolenaar  wrote:
>
> Yegappan wrote:
>
>> On Thu, Aug 9, 2018 at 12:52 PM, Bram Moolenaar  wrote:
>> >
>> > Patch 8.1.0261
>> > Problem:Coverity complains about a negative array index.
>> > Solution:   When qf_id2nr() cannot find the list then don't set qf_curlist.
>> > Files:  src/quickfix.c
>> >
>> >
>> > *** ../vim-8.1.0260/src/quickfix.c  2018-08-09 21:19:15.774436077 +0200
>> > --- src/quickfix.c  2018-08-09 21:49:36.929501416 +0200
>> > ***
>> > *** 4339,4352 
>> >   }
>> >
>> >   /*
>> >* Jump to the first entry if there is one.
>> >*/
>> >   static void
>> >   qf_jump_first(qf_info_T *qi, int_u save_qfid, int forceit)
>> >   {
>> > ! // If autocommands changed the current list, then restore it
>> > ! if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
>> > !   qi->qf_curlist = qf_id2nr(qi, save_qfid);
>> >
>> >   // Autocommands might have cleared the list, check for it
>> >   if (!qf_list_empty(qi, qi->qf_curlist))
>> > --- 4335,4365 
>> >   }
>> >
>> >   /*
>> > +  * If the current list is not "save_qfid" and we can find the list with 
>> > that ID
>> > +  * then make it the current list.
>> > +  * This is used when autocommands may have changed the current list.
>> > +  */
>> > + static void
>> > + qf_restore_list(qf_info_T *qi, int_u save_qfid)
>> > + {
>> > + int curlist;
>> > +
>> > + if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
>> > + {
>> > +   curlist = qf_id2nr(qi, save_qfid);
>> > +   if (curlist >= 0)
>> > +   qi->qf_curlist = curlist;
>> > +   // else: what if the list can't be found?
>> >
>>
>> In all the places where qf_restore_list() is currently invoked, there
>> is a call to
>> qflist_valid() to check whether the list with the specified id is
>> present or not.
>> If the list is not present, then qf_restore_list() is not called. But
>> in the future,
>> someone might call qf_restore_list() without first checking whether the list
>> is still present in the stack or not.
>
> Yes, so the current construction is brittle, if someone makes changes
> and forgets to call qflist_valid() then things break.  That's basically
> what Coverity complains about: unless you are careful qf_curlist becomes
> negative.
>
> We should move qflist_valid() into qf_restore_list(), and let it return
> FAIL when the list isn't valid.
>

There is no need to call qflist_valid() in qf_restore_list() as the qf_id2nr()
function (called by qf_restore_list()) already iterates through all the lists
in the stack.

>
> Then the caller must deal with the
> failure.  This also applies to qf_jump_first() indirectly.
>
> Can you make it work like that?
>

I am attaching a patch that does this.

- 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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


qfempty.diff
Description: Binary data


Re: Patch 8.1.0261

2018-08-10 Fir de Conversatie Bram Moolenaar


Yegappan wrote:

> On Thu, Aug 9, 2018 at 12:52 PM, Bram Moolenaar  wrote:
> >
> > Patch 8.1.0261
> > Problem:Coverity complains about a negative array index.
> > Solution:   When qf_id2nr() cannot find the list then don't set qf_curlist.
> > Files:  src/quickfix.c
> >
> >
> > *** ../vim-8.1.0260/src/quickfix.c  2018-08-09 21:19:15.774436077 +0200
> > --- src/quickfix.c  2018-08-09 21:49:36.929501416 +0200
> > ***
> > *** 4339,4352 
> >   }
> >
> >   /*
> >* Jump to the first entry if there is one.
> >*/
> >   static void
> >   qf_jump_first(qf_info_T *qi, int_u save_qfid, int forceit)
> >   {
> > ! // If autocommands changed the current list, then restore it
> > ! if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
> > !   qi->qf_curlist = qf_id2nr(qi, save_qfid);
> >
> >   // Autocommands might have cleared the list, check for it
> >   if (!qf_list_empty(qi, qi->qf_curlist))
> > --- 4335,4365 
> >   }
> >
> >   /*
> > +  * If the current list is not "save_qfid" and we can find the list with 
> > that ID
> > +  * then make it the current list.
> > +  * This is used when autocommands may have changed the current list.
> > +  */
> > + static void
> > + qf_restore_list(qf_info_T *qi, int_u save_qfid)
> > + {
> > + int curlist;
> > +
> > + if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
> > + {
> > +   curlist = qf_id2nr(qi, save_qfid);
> > +   if (curlist >= 0)
> > +   qi->qf_curlist = curlist;
> > +   // else: what if the list can't be found?
> >
> 
> In all the places where qf_restore_list() is currently invoked, there
> is a call to
> qflist_valid() to check whether the list with the specified id is
> present or not.
> If the list is not present, then qf_restore_list() is not called. But
> in the future,
> someone might call qf_restore_list() without first checking whether the list
> is still present in the stack or not.

Yes, so the current construction is brittle, if someone makes changes
and forgets to call qflist_valid() then things break.  That's basically
what Coverity complains about: unless you are careful qf_curlist becomes
negative.

We should move qflist_valid() into qf_restore_list(), and let it return
FAIL when the list isn't valid.  Then the caller must deal with the
failure.  This also applies to qf_jump_first() indirectly.

Can you make it work like that?

-- 
Shaw's Principle: Build a system that even a fool can use, and
only a fool will want to use it.

 /// Bram Moolenaar -- b...@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///

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Patch 8.1.0261

2018-08-09 Fir de Conversatie Yegappan Lakshmanan
Hi Bram,

On Thu, Aug 9, 2018 at 12:52 PM, Bram Moolenaar  wrote:
>
> Patch 8.1.0261
> Problem:Coverity complains about a negative array index.
> Solution:   When qf_id2nr() cannot find the list then don't set qf_curlist.
> Files:  src/quickfix.c
>
>
> *** ../vim-8.1.0260/src/quickfix.c  2018-08-09 21:19:15.774436077 +0200
> --- src/quickfix.c  2018-08-09 21:49:36.929501416 +0200
> ***
> *** 4339,4352 
>   }
>
>   /*
>* Jump to the first entry if there is one.
>*/
>   static void
>   qf_jump_first(qf_info_T *qi, int_u save_qfid, int forceit)
>   {
> ! // If autocommands changed the current list, then restore it
> ! if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
> !   qi->qf_curlist = qf_id2nr(qi, save_qfid);
>
>   // Autocommands might have cleared the list, check for it
>   if (!qf_list_empty(qi, qi->qf_curlist))
> --- 4335,4365 
>   }
>
>   /*
> +  * If the current list is not "save_qfid" and we can find the list with 
> that ID
> +  * then make it the current list.
> +  * This is used when autocommands may have changed the current list.
> +  */
> + static void
> + qf_restore_list(qf_info_T *qi, int_u save_qfid)
> + {
> + int curlist;
> +
> + if (qi->qf_lists[qi->qf_curlist].qf_id != save_qfid)
> + {
> +   curlist = qf_id2nr(qi, save_qfid);
> +   if (curlist >= 0)
> +   qi->qf_curlist = curlist;
> +   // else: what if the list can't be found?
>

In all the places where qf_restore_list() is currently invoked, there
is a call to
qflist_valid() to check whether the list with the specified id is
present or not.
If the list is not present, then qf_restore_list() is not called. But
in the future,
someone might call qf_restore_list() without first checking whether the list
is still present in the stack or not.

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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.