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);
-- 
Takashi Yano <takashi.y...@nifty.ne.jp>

Reply via email to