On Thu, 1 May 2025 12:55:40 +0100
Jon Turney <wrote:
> On 29/04/2025 18:42, Jeremy Drake via Cygwin-patches wrote:
> > In the CCP_POSIX_TO_WIN_W path, when `from` is a device,
> > cygwin_conv_path would attempt to write to the `to` buffer before the
> > validation of the `size`.  This resulted in an EFAULT error in the
> > common use-case of passing `to` as NULL and `size` as 0 to get the
> > required size of `to` for the conversion (as used in
> 
> This is clearly not what's wanted! Thanks for fixing this!

Pushed.

> > cygwin_create_path).  Instead, set a boolean and write to `to`
> > after validation.
> > 
> > Fixes: 43f65cdd7dae ("* Makefile.in (DLL_OFILES): Add fhandler_procsys.o.")
> > Addresses: https://cygwin.com/pipermail/cygwin/2025-April/258068.html
> > Signed-off-by: Jeremy Drake <cyg...@jdrake.com>
> > ---
> >   winsup/cygwin/path.cc       | 5 ++++-
> >   winsup/cygwin/release/3.6.2 | 3 +++
> >   2 files changed, 7 insertions(+), 1 deletion(-)
> > 
> > diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
> > index 7a08e978ad..d26f99ee7f 100644
> > --- a/winsup/cygwin/path.cc
> > +++ b/winsup/cygwin/path.cc
> > @@ -3911,6 +3911,7 @@ cygwin_conv_path (cygwin_conv_path_t what, const void 
> > *from, void *to,
> >     int how = what & CCP_CONVFLAGS_MASK;
> >     what &= CCP_CONVTYPE_MASK;
> >     int ret = -1;
> > +  bool prependglobalroot = false;
> > 
> >     __try
> >       {
> > @@ -4019,7 +4020,7 @@ cygwin_conv_path (cygwin_conv_path_t what, const void 
> > *from, void *to,
> >         {
> >           /* Device name points to somewhere else in the NT namespace.
> >              Use GLOBALROOT prefix to convert to Win32 path. */
> > -         to = (void *) wcpcpy ((wchar_t *) to, ro_u_globalroot.Buffer);
> > +         prependglobalroot = true;
> 
> It seems like this could all be done in-place in .Buffer here, but I'm 
> going to defer to Corinna on if that's at all clearer...
> 
> >           lsiz += ro_u_globalroot.Length / sizeof (WCHAR);
> >         }
> >       /* TODO: Same ".\\" band-aid as in CCP_POSIX_TO_WIN_A case. */
> > @@ -4075,6 +4076,8 @@ cygwin_conv_path (cygwin_conv_path_t what, const void 
> > *from, void *to,
> >       stpcpy ((char *) to, buf);
> >       break;
> >     case CCP_POSIX_TO_WIN_W:
> > +     if (prependglobalroot)
> > +       to = (void *) wcpcpy ((PWCHAR) to, ro_u_globalroot.Buffer);
> >       wcpcpy ((PWCHAR) to, path);
> >       break;
> >     }
> > diff --git a/winsup/cygwin/release/3.6.2 b/winsup/cygwin/release/3.6.2
> > index bceabcab34..de6eae13fc 100644
> > --- a/winsup/cygwin/release/3.6.2
> > +++ b/winsup/cygwin/release/3.6.2
> > @@ -13,3 +13,6 @@ Fixes:
> > 
> >   - Fix setting DOS attributes on devices.
> >     Addresse: https://cygwin.com/pipermail/cygwin/2025-April/257940.html
> > +
> > +- Fix cygwin_conv_path writing to 'to' pointer before size is checked.
> > +  Addresses: https://cygwin.com/pipermail/cygwin/2025-April/258068.html
> 
> 
> Seems like this should also touch:
> 
> https://cygwin.com/cygwin-api/func-cygwin-conv-path.html
> 
> (source in winsup/doc/path.xml)
> 
> 
> I'm not sure what the conventional language to use for this common 
> behaviour:
> 
> "If size is 0, (to is ignored|to can be NULL) and cygwin_conv_path just 
> returns the required buffer size in bytes" ?

Jon,
Could you please check if the patch
https://cygwin.com/pipermail/cygwin-patches/2025q2/013694.html
from Jeremy is as you intended?

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

Reply via email to