gix-path v0.10.11
Bug Fixes
-
Don't require usable temp dir to get installation config
When runninggit config -l ...
to find the configuration file
path associated with thegit
installation itself, the current
working directory for the subprocess was set to the current
directory prior to #1523, and to/tmp
or a/tmp
-like directory
since #1523 (which improved performance and security).This builds on #1523, as well as on subsequent changes to run
git
in a way that its behavior depends less on its CWD, by making an
even more robust choice of CWD for the subprocess, so that the CWD
is less likely to be deeply nested or on network storage; more
likely to exist; and, on Unix-like systems, less likely to contain
a.git
entry (though agit
with security updates should refuse
to take any configuration from such a repository unless it is owned
by the user).Due to a combination of other measures that harden against
malicious or unusual contents (especially settingGIT_DIR
), the
most significant benefit of this change is to fix the problem that
a nonexistent temp dir would prevent the command from succeeding.The main way that could happen is if
TMPDIR
on Unix-like systems,
orTMP
orTEMP
on Windows, is set to an incorrect value.
Because these variables are sometimes reasonable to customize for
specific purposes, it is plausible for them to be set to incorrect
values by accident.Except on Windows, this always uses
/
as the CWD for the
subprocess.On Windows, we use the Windows directory (usually
C:\Windows
)
rather than the root of the system drive (usuallyC:\
), because:- We are currently obtaining this information from environment
variables, and it is possible for our own parent process to pass
down an overly sanitized environment.
Although this can be so sanitized we cannot find the Windows
directory, this is less likely to occur than being unable to find
the root of the system drive.This due to moderately broad awareness that the
SystemRoot
environment variable (which, somewhat confusingly, holds the path
of the Windows directory, not the root of the system drive)
should be preserved even when clearing most other variables.Some libraries will even automatically preserve
SystemRoot
when
clearing others or restore it. For example: - We are currently obtaining this information from environment
-
Under the current behavior of
env::temp_dir()
, which is now a
fallback if we cannot determine the Windows directory, we already
fall back to the Windows directory evenutally, if temp dir
related environment variables are also unset.This is because
env::temp_dir()
usually callsGetTempDir2
in
the Windows API, which implements that fallback behavior (after
first trying the user's user profile directory).Avoiding adding yet another place to fall back to that would not
otherwise be attempted slightly decreases behavioral complexity,
and there is no reason to think a directory likeC:\
would work
when a directory likeC:\Windows
doesn't. -
The root of the system drive on a Windows system usually permits
limited user accounts to create new directories there, so a
directory likeC:\
on Windows actually has most of the
disadvantages of a location like/tmp
on a Unix-like system.This is actually a much less significant reason to prefer a
directory likeC:\Windows
to a directory likeC:\
than it
might seem. After all, ifC:\.git
exists and andgit
uses it
when run fromC:\
, thengit
would usually also use it when
run fromC:\Windows
(and from numerous other locations)!However, the reason there is still a small reason to prefer a
location likeC:\Windows
to a location likeC:\
is that, if a
system has a vulnerablegit
but a user or system administrator
has sought to work around it by listingC:\
in
GIT_CEILING_DIRECTORIES
, then that may keepgit
from
traversing upward intoC:\
, but it would not keepC:\
from
being used if that is where we already are.An even more significant reason this motivation is a minor one is
that the other measures we are taking, including setting
GIT_DIR
, should be sufficient to avoid at least the security
dimension of the problem, which arises from actually using the
configuration from a repo that is discovered.
-
The user profile directory may be more deeply nested.
-
The user profile directory may sometimes be on slow network
storage when the discovered Windows directory is not. -
In some situations, the user profile directory does not actually
exist, or does not exist yet. -
Overly sanitized environments are more likely to lack the
USERPROFILE
vairable than theSystemRoot
variable. -
Users may occasionally choose to have their entire user profile
directory be a Git repository. -
It's no easier to avoid the problem of using
C:\.git
in a user
profile directory than inC:\Windows
: they're usually both under
C:\
, and are both not the same asC:\
. (If the user profile
directory is a repository, then that will avoid that problem, yet
be its own problem, if not for other measures that prevent both.) -
If the
git
command is an old and unpatched vulnerable version
in whichsafe.directory
is not yet implemented, or in which
GHSA-j342-m5hw-rr3v
or other vulnerabilities wheregit
would perform operations on
untrusted local repositories owned by other users are unpatched,
then a.git
subdirectory of a shared/tmp
or/tmp
-like
directory could be created by another account, and its local
configuration would still have been used. (This is not a bug in
gitoxide per se; having vulnerable software installed that other
software may use is inherently insecure. But it is nice to offer
a small amount of protection against this when readily feasible.) -
If the
/tmp
-like location is a Git repository owned by the
current user, then its local configuration would have been used. -
Parsing is more reliable for paths containing unusual characters,
because-z
/--null
causes all paths to be output literally.Previously,
"
characters were trimmed from the ends, but this
would not always extract a correct path, because when a path
contains characters that causegit
to enclose it in double
quotes, those characters are usually represented in a symbolic
form, usually with\
escapes.In some scenarios, such as usually on Windows when the escaped
character is itself a\
and not in the leading position, the
mangled path would be usable, but more often it would not. -
The volume of output is less, because
--name-only
casues values
not to be included in the output. -
The combination of
-z
/--null
and--name-only
makes the
output format simpler, and the parsing logic is accordingly
simpler.
Commit Statistics
- 56 commits contributed to the release.
- 14 days passed between releases.
- 3 commits were understood as conventional.
- 0 issues like '(#ID)' were seen in commit messages
Commit Details
view details
- Uncategorized
- Prepare changelogs prior to release. (c759819)
- Merge pull request #1569 from EliahKagan/config-origin-naming (3cf9694)
- Rename to
GIT_HIGHEST_SCOPE_CONFIG_PATH
(0672576) - Merge pull request #1568 from EliahKagan/config-origin-next (adbaa2a)
- Rename
EXE_INFO
to something that probably captures its contents better. (dd2d666) - Run
cargo fmt
(b11f7db) - Make
EXE_NAME
aconst
too (fb0b6d8) - Make
NULL_DEVICE
aconst
, rather than astatic
item (9917d47) - Put
first_file_from_config_with_origin
test with related ones (57e9a6f) - Fix indentation nit (7cd20bb)
- Merge pull request #1567 from EliahKagan/config-origin (dd65e7b)
- Improve structure of
exe_info
tests (5ac5f74) - Clarify comment about where we run
git
from (5200184) - Test no local scope with empty system config (6160a83)
- Don't set/change ceiling directories (2bce0d2)
- Explore also setting a ceiling directory (073e277)
- Fix misstatement of Windows directory rationale (4e936bc)
- Unset a couple env vars just in case (8f6d39d)
- Simplify the new comments (b827813)
- Explain why we run
git
from a different directory (7fa5e35) - Small clarity tweaks (598c487)
- Fix
os::windows
error on non-Windows (1305114) - Refactor for readability; clarify comments (ab0dcc1)
- Fix unused import on non-Windows systems (8472447)
- Don't require usable temp dir to get installation config (f70b904)
- Explain why we don't just use
--system
(29c6cca) - Explain why we don't just use
--show-scope
(f35e44c) - Fix a test name for consistency (15e7b67)
- Add another broken temp test (c80d562)
- Extract nonexistent directory logic to a test helper struct (e60540f)
- Maybe slightly decrease risk of test precondition check failure (56dab13)
- Adjust some test code for clarity (5c1b4c0)
- Check
env::temp_dir()
in both tests that set temp vars (79af259) - Clarify assert and expect messages (703f882)
- Test EXE_INFO no local config even if temp dir doesn't exist (60465a5)
- Slightly improve quality of test failure messages (9641660)
- Set GIT_WORK_TREE along with GIT_DIR, to avoid confusion (5723077)
- More robustly ensure "installation" config is not local (7280a2d)
- Check that the test affects
env::temp_dir()
as desired (15cec4e) - Fix bug in new test where temp dir should be a repo (744bb38)
- Test EXE_INFO no local config even if temp dir is a repo (287f267)
- Code formatting (65d5151)
- Fix EXE_INFO no local scope test for macOS (49e0715)
- Add generated archive for local_config.sh (fd065ac)
- Test that EXE_INFO never has local scope config (5a300e6)
- Make EXE_INFO testable and add a basic test for it (1ee98bf)
- Reorder gix_path::env::git tests to match order in code (ccd0401)
- Extract git_cmd helper for EXE_INFO (de2f35f)
- Parse installation config path more robustly (650a1b5)
- Comment Git version compatibility for EXE_INFO (9df57aa)
- Merge pull request #1557 from Byron/merge-base (649f588)
- Allow empty-docs (beba720)
- Merge branch 'global-lints' (37ba461)
- Workspace Clippy lint management (2e0ce50)
- Merge pull request #1546 from nyurik/semilocons (f992fb7)
- Add missing semicolons (ec69c88)