On Feb 13 15:15, Corinna Vinschen wrote:
> On Feb 12 17:37, Jeremy Drake via Cygwin-patches wrote:
> > On Wed, 12 Feb 2025, Jeremy Drake via Cygwin-patches wrote:
> > 
> > > On Wed, 12 Feb 2025, Jeremy Drake via Cygwin-patches wrote:
> > >
> > > > It was *supposed* to not return the second one.  Maybe I broke it when
> > > > trying to break out of the loop early...  I will test this scenario and
> > > > see why it doesn't work as expected.
> > >
> > > Yeah, I never actually looked at how posix_sorted was sorted.  It's sorted
> > > by length first, then by strcmp.  This was probably a premature
> > > optimization anyway.  conv_to_posix_path doesn't try to bail early, it
> > > just continues, and that's going to be a much more common code path than
> > > this...
> > 
> > Not only that, but there's a sash-vs-backslash mismatch between
> > native_path and mnt_fsname resulting in the strcasematch not matching.  I
> > must have only tested the root-of-drive-letter case (where the paths are
> > like C:), because that was the case the existing code was handling:
> > 
> > diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc
> > index 4be24fbe84..ef3070dbe1 100644
> > --- a/winsup/cygwin/mount.cc
> > +++ b/winsup/cygwin/mount.cc
> > @@ -1645,14 +1645,8 @@ fillout_mntent (const char *native_path, const char
> > *posix_path, unsigned flags)
> >    struct mntent& ret=_my_tls.locals.mntbuf;
> >    bool append_bs = false;
> > 
> > -  /* Remove drivenum from list if we see a x: style path */
> >    if (strlen (native_path) == 2 && native_path[1] == ':')
> > -    {
> > -      int drivenum = cyg_tolower (native_path[0]) - 'a';
> > -      if (drivenum >= 0 && drivenum <= 31)
> > -       _my_tls.locals.available_drives &= ~(1 << drivenum);
> >        append_bs = true;
> > -    }
> > 
> > 
> > I have a fix for these, and I also added a patch 3 on top which removes
> > the de-duplication code and calls cygdrive_posix_path instead of
> > conv_to_posix_path.  You can not apply patch 3, apply patch 3 in case it
> > has to be reverted later, or squash it into 2 if you prefer, there's
> > options.
> 
> I think this looks good, including patch 3.

To wit:

  $ mount | grep drvmount
  C:/drvmount on /mnt/c/drvmount type ntfs (binary,posix=0,noumount,auto)
  $ mount C:/drvmount /home/corinna/drv
  $ mount | grep drvmount
  C:/drvmount on /home/corinna/drv type ntfs (binary,user)
  C:/drvmount on /mnt/c/drvmount type ntfs (binary,posix=0,noumount,auto)
  $ df /mnt/c/drvmount
  Filesystem     1K-blocks  Used Available Use% Mounted on
  C:/drvmount      4175868 56744   4119124   2% /mnt/c/drvmount
  $ df /home/corinna/drv
  Filesystem     1K-blocks  Used Available Use% Mounted on
  C:/drvmount      4175868 56744   4119124   2% /home/corinna/drv

> If you're fine with that,
> I'll push all three patches.
> 
> 
> Corinna

Reply via email to