On Tue, 19 Nov 2024 10:49:39 +0100
Corinna Vinschen wrote:
> On Nov 19 17:39, Takashi Yano wrote:
> > On Mon, 18 Nov 2024 16:55:14 +0100
> > Corinna Vinschen wrote:
> > > On Nov 15 22:14, Takashi Yano wrote:
> > > > The commit ae181b0ff122 has a bug that the pointer is referred bofore
> > > > NULL check in the function lf_clearlock(). This patch fixes that.
> > > > 
> > > > Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256750.html
> > > > Fixes: ae181b0ff122 ("Cygwin: lockf: Make lockf() return ENOLCK when 
> > > > too many locks")
> > > > Reported-by: Sebastian Feld <sebastian.n.f...@gmail.com>
> > > > Reviewed-by:
> > > > Signed-off-by: Takashi Yano <takashi.y...@nifty.ne.jp>
> > > > ---
> > > >  winsup/cygwin/flock.cc | 6 ++++--
> > > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc
> > > > index 3821bddd6..794e66bd7 100644
> > > > --- a/winsup/cygwin/flock.cc
> > > > +++ b/winsup/cygwin/flock.cc
> > > > @@ -1524,6 +1524,10 @@ lf_clearlock (lockf_t *unlock, lockf_t **clean, 
> > > > HANDLE fhdl)
> > > >    lockf_t *lf = *head;
> > > >    lockf_t *overlap, **prev;
> > > >    int ovcase;
> > > > +
> > > > +  if (lf == NOLOCKF)
> > > > +    return 0;
> > > > +
> > > >    inode_t *node = lf->lf_inode;
> > > >    tmp_pathbuf tp;
> > > >    node->i_all_lf = (lockf_t *) tp.w_get ();
> > > > @@ -1531,8 +1535,6 @@ lf_clearlock (lockf_t *unlock, lockf_t **clean, 
> > > > HANDLE fhdl)
> > > >    uint32_t lock_cnt = node->get_lock_count ();
> > > >    bool first_loop = true;
> > > >  
> > > > -  if (lf == NOLOCKF)
> > > > -    return 0;
> > > >    prev = head;
> > > >    while ((ovcase = lf_findoverlap (lf, unlock, SELF, &prev, &overlap)))
> > > >      {
> > > > -- 
> > > > 2.45.1
> > > 
> > > LGTM, please push.
> > 
> > Thanks for reviewing this patch. Could you please review
> >  [PATCH v2] Cygwin: flock: Fix overlap handling in lf_setlock() and 
> > lf_clearlock()
> > as well?
> 
> Give me a bit of time.  While the patch might fix the problem, what
> bugs me is the deviation from upstream code.  We will at least need
> a few comments to explain why we don't follow the upstream behaviour.

I've got it. Does this code come from 'upstream'? From what code?
Essentially, the ovcase 1 can be a part of ovcase 3. I guess the
'upstream' does not add lock entry having same lock range unlike
current cygwin (lf_ver related). So, ovcase 1 can break after
handling 1 overlap. However, we need find overlap repeatedly
because we have lf_ver.

-- 
Takashi Yano <takashi.y...@nifty.ne.jp>

Reply via email to