From: Johannes Schindelin <johannes.schindelin@gmx.de>
To: cygwin-patches@cygwin.com
Subject: [PATCH v7 4/4] Do not rely on `getenv ("HOME")`'s path conversion
Date: Mon, 22 May 2023 13:13:02 +0200 (CEST) [thread overview]
Message-ID: <002d94a244166f04d4326c18b5ab475e3a9f6b17.1684753873.git.johannes.schindelin@gmx.de> (raw)
In-Reply-To: <cover.1684753872.git.johannes.schindelin@gmx.de>
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>
---
winsup/cygwin/uinfo.cc | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 5e2d88bcd7..21d729d5dc 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -929,7 +929,13 @@ fetch_home_env (void)
/* If `HOME` is set, prefer it */
const char *home = getenv ("HOME");
if (home)
- return strdup (home);
+ {
+ /* In the very early code path of `user_info::initialize ()`, the value
+ of the environment variable `HOME` is still in its Windows form. */
+ if (isdrive (home) || home[0] == '\\')
+ return (char *) cygwin_create_path (CCP_WIN_A_TO_POSIX, home);
+ return strdup (home);
+ }
/* If `HOME` is unset, fall back to `HOMEDRIVE``HOMEPATH`
(without a directory separator, as `HOMEPATH` starts with one). */
--
2.41.0.rc0.windows.1
next prev parent reply other threads:[~2023-05-22 11:13 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-16 13:06 [PATCH] Allow overriding the home directory via the HOME variable Johannes Schindelin
2015-10-21 18:32 ` Corinna Vinschen
2015-10-22 15:38 ` Johannes Schindelin
2015-10-23 9:10 ` Corinna Vinschen
2015-10-23 9:41 ` Corinna Vinschen
2015-10-23 12:00 ` Johannes Schindelin
2015-12-17 18:05 ` [PATCH v2 0/2] Support deriving the current user's home directory via HOME Johannes Schindelin
2015-12-17 18:05 ` [PATCH v2 1/2] Allow deriving the current user's home directory via the HOME variable Johannes Schindelin
2015-12-17 20:20 ` Corinna Vinschen
2022-09-21 11:58 ` Johannes Schindelin
2022-10-18 17:02 ` Corinna Vinschen
2022-10-23 21:04 ` Johannes Schindelin
2022-10-24 11:37 ` Corinna Vinschen
2022-11-10 15:16 ` Johannes Schindelin
2022-11-10 15:22 ` Corinna Vinschen
2022-11-18 8:18 ` Johannes Schindelin
2022-11-21 11:41 ` Corinna Vinschen
2023-03-28 8:21 ` Johannes Schindelin
2015-12-17 18:05 ` [PATCH v2 2/2] Respect `db_home` setting even for the SYSTEM account Johannes Schindelin
2015-12-17 20:49 ` Corinna Vinschen
2015-12-17 21:02 ` Corinna Vinschen
2022-09-21 12:00 ` Johannes Schindelin
2022-09-21 11:51 ` [PATCH v3 0/3] Support deriving the current user's home directory via HOME Johannes Schindelin
2022-09-21 11:51 ` [PATCH v3 1/3] Allow deriving the current user's home directory via the HOME variable Johannes Schindelin
2022-09-21 11:52 ` [PATCH v3 2/3] Respect `db_home` setting even for SYSTEM/Microsoft accounts Johannes Schindelin
2022-09-21 11:52 ` [PATCH v3 3/3] Respect `db_home: env` even when no uid can be determined Johannes Schindelin
2023-03-28 8:17 ` [PATCH v4 0/3] Support deriving the current user's home directory via HOME Johannes Schindelin
2023-03-28 8:17 ` [PATCH v4 1/3] Allow deriving the current user's home directory via the HOME variable Johannes Schindelin
2023-03-28 10:35 ` Corinna Vinschen
2023-03-28 12:34 ` Jon Turney
2023-03-28 13:31 ` Corinna Vinschen
2023-03-29 8:36 ` Corinna Vinschen
2023-04-03 6:39 ` Johannes Schindelin
2023-03-28 8:17 ` [PATCH v4 2/3] Respect `db_home` setting even for SYSTEM/Microsoft accounts Johannes Schindelin
2023-03-28 10:16 ` Corinna Vinschen
2023-04-03 6:36 ` Johannes Schindelin
2023-04-03 10:59 ` Corinna Vinschen
2023-04-03 13:32 ` Johannes Schindelin
2023-03-28 8:17 ` [PATCH v4 3/3] Respect `db_home: env` even when no uid can be determined Johannes Schindelin
2023-03-28 10:17 ` Corinna Vinschen
2023-04-03 6:45 ` Johannes Schindelin
2023-04-03 13:12 ` Johannes Schindelin
2023-04-03 13:29 ` Corinna Vinschen
2023-04-03 13:57 ` Johannes Schindelin
2023-04-03 19:23 ` Corinna Vinschen
2023-04-04 15:11 ` Johannes Schindelin
2023-04-03 13:19 ` Johannes Schindelin
2023-04-03 14:44 ` [PATCH v5 0/3] Support deriving the current user's home directory via HOME Johannes Schindelin
2023-04-03 14:44 ` [PATCH v5 1/3] Allow deriving the current user's home directory via the HOME variable Johannes Schindelin
2023-04-03 18:36 ` Corinna Vinschen
2023-04-04 15:12 ` Johannes Schindelin
2023-04-03 14:45 ` [PATCH v5 2/3] Respect `db_home` setting even for SYSTEM/Microsoft accounts Johannes Schindelin
2023-04-03 18:37 ` Corinna Vinschen
2023-04-04 15:12 ` Johannes Schindelin
2023-04-03 14:45 ` [PATCH v5 3/3] Respect `db_home: env` even when no uid can be determined Johannes Schindelin
2023-04-04 15:07 ` [PATCH v6 0/4] Support deriving the current user's home directory via HOME Johannes Schindelin
2023-04-04 15:07 ` [PATCH v6 1/4] Allow deriving the current user's home directory via the HOME variable Johannes Schindelin
2023-04-04 15:07 ` [PATCH v6 2/4] Respect `db_home` setting even for SYSTEM/Microsoft accounts Johannes Schindelin
2023-04-04 15:07 ` [PATCH v6 3/4] uinfo: special-case IIS APPPOOL accounts Johannes Schindelin
2023-04-04 15:07 ` [PATCH v6 4/4] Do not rely on `getenv ("HOME")`'s path conversion Johannes Schindelin
2023-04-06 8:37 ` Corinna Vinschen
2023-04-06 9:54 ` Johannes Schindelin
2023-04-06 10:28 ` Corinna Vinschen
2023-05-22 11:12 ` [PATCH v7 0/4] Support deriving the current user's home directory via HOME Johannes Schindelin
2023-05-22 11:12 ` [PATCH v7 1/4] Allow deriving the current user's home directory via the HOME variable Johannes Schindelin
2023-05-22 11:12 ` [PATCH v7 2/4] Respect `db_home` setting even for SYSTEM/Microsoft accounts Johannes Schindelin
2023-05-22 11:12 ` [PATCH v7 3/4] uinfo: special-case IIS APPPOOL accounts Johannes Schindelin
2023-05-22 11:13 ` Johannes Schindelin [this message]
2023-06-06 13:33 ` [PATCH v7 0/4] Support deriving the current user's home directory via HOME Corinna Vinschen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=002d94a244166f04d4326c18b5ab475e3a9f6b17.1684753873.git.johannes.schindelin@gmx.de \
--to=johannes.schindelin@gmx.de \
--cc=cygwin-patches@cygwin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).