On Wed, 11 Jun 2025, Jeremy Drake via Cygwin wrote:

> While making some tests for a path parser in rust
> (https://github.com/rust-lang/rust/pull/141864), an interesting corner
> case in Cygwin path handling came to light:
>
> Works:
> \\.\C:
> //.\C:
> //./C:\foo
>
> Doesn't work:
> //./C:
> //./C:/foo
>
> It appears to be able to use the \\.\ prefix, there must be at least 1
> backslash in the path.  Otherwise, it seems that . and .. are being
> normalized like a normal path and //./C:/foo is treated like
> //C:/foo.  The delay attempting to access it makes me think it is looking
> for a server/share style path.
>
> My question is whether this behavior is intentional or a bug.  I don't
> want to see rust codify this in their path parser and tests, only to have
> it change later as a bugfix in a corner case of path handling.

The docs say
https://cygwin.com/cygwin-ug-net/using.html#pathnames-win32
The following paths are treated as native Win32 paths by the Cygwin DLL
(but not necessarily by Cygwin applications):

All paths starting with a drive specifier
  C:\foo
  C:/foo

All paths containing at least one backslash as path component
  C:/foo/bar\baz/...

UNC paths using backslashes
  \\server\share\...

An interesting corner case:
ls -l '/a\b'
is the same as '/a/b', but
ls -l '\a/b'
will refer to X:\a\b where X is the drive letter of the CWD.  If the CWD
is /proc (so something without a Windows CWD), it seems to fall back to
referring to '/a/b' again?!?

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to