acadia-newlib/winsup
Johannes Schindelin 80ff7bc26c Do not rely on `getenv ("HOME")`'s path conversion
In the very early code path where `dll_crt0_1 ()` calls
`user_shared->initialize ()`, the Cygwin runtime calls `internal_pwsid ()`
to initialize the user name in preparation for reading the `fstab` file.

In case `db_home: env` is defined in `/etc/nsswitch.conf`, we need to
look at the environment variable `HOME` and use it, if set.

When all of this happens, though, the `pinfo_init ()` function has had no
chance to run yet (and therefore, `environ_init ()`). At this stage,
therefore, `getenv ()`'s `findenv_func ()` call still finds `getearly ()`
and we get the _verbatim_ value of `HOME`. That is, the Windows form.
But we need the "POSIX" form.

To add insult to injury, later calls to `getpwuid (getuid ())` will
receive a cached version of the home directory via
`cygheap->pg.pwd_cache.win.find_user ()` thanks to the first
`internal_pwsid ()` call caching the result via
`add_user_from_cygserver ()`, read: we will never receive the converted
`HOME` but always the Windows variant.

So, contrary to the assumptions made in 27376c60a9 (Allow deriving the
current user's home directory via the HOME variable, 2023-03-28), we
cannot assume that `getenv ("HOME")` returned a "POSIX" path.

This is a real problem. Even setting aside that common callers of
`getpwuid ()` (such as OpenSSH) are unable to handle Windows paths in the
`pw_dir` attribute, the Windows path never makes it back to the caller
unscathed. The value returned from `fetch_home_env ()` is not actually
used as-is. Instead, the `fetch_account_from_windows ()` method uses it
to write a pseudo `/etc/passwd`-formatted line that is _then_ parsed via
the `pwdgrp::parse_passwd ()` method which sees no problem with
misinterpreting the colon after the drive letter as a field separator of
that `/etc/passwd`-formatted line, and instead of a Windows path, we now
have a mere drive letter.

Let's detect when the `HOME` value is still in Windows format in
`fetch_home_env ()`, and convert it in that case.

For good measure, interpret this "Windows format" not only to include
absolute paths with drive prefixes, but also UNC paths.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2023-06-06 15:18:53 +02:00
..
CVSChangeLogs.old
cygserver Revert "sys/types.h: Don't include sys/_stdint.h" 2022-05-04 15:08:44 +02:00
cygwin Do not rely on `getenv ("HOME")`'s path conversion 2023-06-06 15:18:53 +02:00
doc Cygwin: doc: Upate a link from gitweb to cgit 2023-05-01 11:29:15 +01:00
testsuite Cygwin: testsuite: Drop appending 'ntsec' to CYGWIN in cygrun wrapper 2023-01-13 17:03:58 +00:00
utils Cygwin: chattr: fix description of requirements for casesensitive directories 2023-04-03 22:41:07 +02:00
CONTRIBUTORS Cygwin: Add Ben Wijen to list of contributors 2021-01-18 12:01:19 +01:00
COPYING
COPYING.LIB
CYGWIN_LICENSE
Makefile.am Cygwin: Conditionally build documentation 2021-12-17 22:28:16 +00:00
Makefile.am.common Cygwin: automake: change @INCLUDES@ to @AM_CPPFLAGS@ to avoid warnings 2021-04-29 11:28:14 +02:00
README
acinclude.m4 Cygwin: Reorganize cygwin source dir 2022-08-05 12:02:11 +02:00
autogen.sh Cygwin: autogen.sh: Allow running from any directory 2021-05-06 10:56:20 +02:00
configure.ac Cygwin: dumper: also link with libzstd, as libbfd may require it 2023-02-14 14:37:32 +00:00

README

THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESSED OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

Cygwin documentation is available on the net at https://cygwin.com
You might especially be interested in

https://cygwin.com/faq/faq.html#faq.programming.building-cygwin