Hi Corinna,

On Tue, 10 Dec 2024 22:10:57 +0900
Takashi Yano wrote:
> On Tue, 10 Dec 2024 14:00:53 +0100
> Corinna Vinschen wrote:
> > Hi Takashi,
> > 
> > On Dec 10 21:21, Takashi Yano wrote:
> > > Hi Corinna,
> > > 
> > > On Mon, 9 Dec 2024 16:26:53 +0100
> > > Corinna Vinschen wrote:
> > > > On Dec  9 22:57, Takashi Yano wrote:
> > > > > On Mon, 9 Dec 2024 22:44:00 +0900
> > > > > Takashi Yano wrote:
> > > > > > On Mon, 9 Dec 2024 12:11:56 +0100
> > > > > > Corinna Vinschen wrote:
> > > > > > > init_reopen_attr() uses the "open by handle" functionality as in 
> > > > > > > the
> > > > > > > Win32 API ReOpenFile().  It only does so if the filesystem 
> > > > > > > supports it.
> > > > > > > Samba usually does, so it's not clear to me why 
> > > > > > > pc.init_reopen_attr()
> > > > > > > fails for you.
> > > > > > 
> > > > > > I didn't mean pc.init_reopen_attr() failed. Just I was no idea
> > > > > > for what handle to be passed.
> > > > > > 
> > > > > > > > What handle should I pass to pc.init_reopen_attr()?
> > > > > > > 
> > > > > > > You could pass pc.handle().  Is pc.handle() in this scenario NULL,
> > > > > > > perhaps?
> > > > > > 
> > > > > > I have tried pc.handle() and suceeded. Thanks for advice!
> > > > > 
> > > > > No! pc.handle() sometimes seems to be NULL....
> > > > 
> > > > Can you please figure out in which scenario it's NULL?  Theoretically
> > > > the function shouldn't even be called in this case.
> > > 
> > > This seems to happen when check_file_access() is called from av::setup()
> > > (spawn.cc:1237) called from child_info_spawn::worker() (spawn.cc:358).
> > 
> > Huh, yeah, thanks for tracking this down.  And this code snippet is
> > actually only called if we *failed* opening the file, so there's no
> > usable handle.
> > 
> > Try this:
> > 
> > 
> > From 23387c343381ba01d02210257e33cf2691611c2d Mon Sep 17 00:00:00 2001
> > From: Corinna Vinschen <cori...@vinschen.de>
> > Date: Tue, 10 Dec 2024 13:55:54 +0100
> > Subject: [PATCH] Cygwin: path_conv: allow NULL handle in init_reopen_attr()
> > 
> > init_reopen_attr() doesn't guard against a NULL handle.  However,
> > there are scenarios calling functions deliberately with a NULL handle,
> > for instance, av::setup() calling check_file_access() only if opening
> > the file did NOT succeed.
> > 
> > So check for a NULL handle in init_reopen_attr() and if so, use the
> > name based approach filling the OBJECT_ATTRIBUTES struct, just as in
> > the has_buggy_reopen() case.
> > 
> > Fixes: 4c9d01fdad2a ("* mount.h (class fs_info): Add has_buggy_reopen flag 
> > and accessor methods.")
> > Signed-off-by: Corinna Vinschen <cori...@vinschen.de>
> > ---
> >  winsup/cygwin/local_includes/path.h | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/winsup/cygwin/local_includes/path.h 
> > b/winsup/cygwin/local_includes/path.h
> > index 3dd21d975abf..2a05cf44d40a 100644
> > --- a/winsup/cygwin/local_includes/path.h
> > +++ b/winsup/cygwin/local_includes/path.h
> > @@ -323,7 +323,7 @@ class path_conv
> >    }
> >    inline POBJECT_ATTRIBUTES init_reopen_attr (OBJECT_ATTRIBUTES &attr, 
> > HANDLE h)
> >    {
> > -    if (has_buggy_reopen ())
> > +    if (!h || has_buggy_reopen ())
> >        InitializeObjectAttributes (&attr, get_nt_native_path (),
> >                               objcaseinsensitive (), NULL, NULL)
> >      else
> > -- 
> > 2.47.0
> > 
> 
> Thanks! Is your patch better than?
> +  if (pc.handle ())
> +    pc.init_reopen_attr (attr, pc.handle ());
> +  else
> +    pc.get_object_attr (attr, sec_none_nih);

I confirmed that both above two patches work.

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

Reply via email to