From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Cc: Phillip Wood <phillip.wood123@gmail.com>, Jeff King <peff@peff.net>
Subject: [PATCH v4 0/4] safe.directory clean-up
Date: Tue, 30 Jul 2024 11:43:48 -0700 [thread overview]
Message-ID: <20240730184352.2503276-1-gitster@pobox.com> (raw)
In-Reply-To: <20240730011004.4030246-1-gitster@pobox.com>
Changes since v3:
- A preliminary patch to fix overly defensive (mis)uses of the
result from git_config_pathname() API call has been added.
- "to_free" variable that did not have the corresponding underlying
variable that may or may not be allocated has been renamed.
Recently we discussed what we should do when either the path
configured in the safe.directory configuration variable or coming
from the caller of ensure_valid_ownership() function as a result of
repository discovery is not normalized and textual equality check is
not sufficient. See the thread the contains
https://lore.kernel.org/git/6d5b75a6-639d-429b-bd37-232fc6f475af@gmail.com/
Here are three patches that implement the comparison between
normalized path and configuration value.
Imagine that you have a repository at /mnt/disk4/repos/frotz
directory but in order to make it simpler to manage and use, you
have your users use /projects/frotz to access the repository. A
symlink /projects/frotz pointing at /mnt/disk4/repos/frotz directory
allows you to do so.
- The first patch normalizes the path to the directory that we
suspect is a usable repository, before comparing it with the
safe.directory configuration variable. The safe.directory may
say /mnt/disk4/repos/frotz or /mnt/disk4/repos/*, but the path to
the repository for the users may be /mnt/disk4/repos/frotz or
/projects/frotz, depending on where they come from and what their
$PWD makes getcwd() to say.
- The second patch normalizes the value of the safe.directory
variable. This allows safe.directory to say /projects/frotz or
/projects/* and have them match /mnt/disk4/repos/frotz (which is
how the first patch normalizes the repository path to). Note
that non-absolute paths in safe.directory are ignored, as they
make little sense, except for ".".
- The third patch only adds a test to illustrate what happens when
the safe.directory configuration is set to ".", which was
advertised as a viable workaround for those who run "git daemon".
Junio C Hamano (4):
safe.directory: preliminary clean-up
safe.directory: normalize the checked path
safe.directory: normalize the configured path
safe.directory: setting safe.directory="." allows the "current" directory
setup.c | 58 ++++++++++---
t/t0033-safe-directory.sh | 178 ++++++++++++++++++++++++++++++++++++++
2 files changed, 225 insertions(+), 11 deletions(-)
Range-diff against v3:
-: ---------- > 1: baed16ada3 safe.directory: preliminary clean-up
1: 7da381eef6 = 2: 2ac2407c22 safe.directory: normalize the checked path
2: 1e872df885 ! 3: 747120dcd7 safe.directory: normalize the configured path
@@ Commit message
## setup.c ##
@@ setup.c: static int safe_directory_cb(const char *key, const char *value,
+ char *allowed = NULL;
if (!git_config_pathname(&allowed, key, value)) {
- const char *check = allowed ? allowed : value;
-- if (ends_with(check, "/*")) {
-- size_t len = strlen(check);
-- if (!fspathncmp(check, data->path, len - 1))
-+ char *to_free = NULL;
+- if (ends_with(allowed, "/*")) {
+- size_t len = strlen(allowed);
+- if (!fspathncmp(allowed, data->path, len - 1))
++ char *normalized = NULL;
+
+ /*
+ * Setting safe.directory to a non-absolute path
@@ setup.c: static int safe_directory_cb(const char *key, const char *value,
+ * level of a repository, then it is OK", which is
+ * slightly tighter than "*" that allows discovery.
+ */
-+ if (!is_absolute_path(check) && strcmp(check, ".")) {
++ if (!is_absolute_path(allowed) && strcmp(allowed, ".")) {
+ warning(_("safe.directory '%s' not absolute"),
-+ check);
++ allowed);
+ goto next;
+ }
+
@@ setup.c: static int safe_directory_cb(const char *key, const char *value,
+ * worthy event when there is no such path on this
+ * machine---the entry may be useful elsewhere.
+ */
-+ to_free = real_pathdup(check, 0);
-+ if (!to_free)
++ normalized = real_pathdup(allowed, 0);
++ if (!normalized)
+ goto next;
-+ if (ends_with(to_free, "/*")) {
-+ size_t len = strlen(to_free);
-+ if (!fspathncmp(to_free, data->path, len - 1))
++
++ if (ends_with(normalized, "/*")) {
++ size_t len = strlen(normalized);
++ if (!fspathncmp(normalized, data->path, len - 1))
data->is_safe = 1;
-- } else if (!fspathcmp(data->path, check)) {
-+ } else if (!fspathcmp(data->path, to_free)) {
+- } else if (!fspathcmp(data->path, allowed)) {
++ } else if (!fspathcmp(data->path, normalized)) {
data->is_safe = 1;
}
-+ free(to_free);
- }
-+ next:
- if (allowed != value)
++ next:
++ free(normalized);
free(allowed);
+ }
}
## t/t0033-safe-directory.sh ##
3: 53605f4e20 = 4: 5d0cd13e34 safe.directory: setting safe.directory="." allows the "current" directory
--
2.46.0-77-g633c50689c
next prev parent reply other threads:[~2024-07-30 18:44 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-20 22:09 [PATCH 0/2] safe.directory clean-up Junio C Hamano
2024-07-20 22:09 ` [PATCH 1/2] safe.directory: normalize the checked path Junio C Hamano
2024-07-20 22:09 ` [PATCH 2/2] safe.directory: normalize the configured path Junio C Hamano
2024-07-20 22:09 ` [PATCH 3/2] setup: use a single return path in setup_git_directory*() Junio C Hamano
2024-07-20 22:09 ` [PATCH 4/2] setup: cache normalized safe.directory configuration Junio C Hamano
2024-07-23 2:18 ` [PATCH v2 0/3] safe.directory clean-up Junio C Hamano
2024-07-23 2:18 ` [PATCH v2 1/3] safe.directory: normalize the checked path Junio C Hamano
2024-07-23 2:18 ` [PATCH v2 2/3] safe.directory: normalize the configured path Junio C Hamano
2024-07-25 9:45 ` Phillip Wood
2024-07-25 16:11 ` Junio C Hamano
2024-08-14 13:20 ` Phillip Wood
2024-08-14 17:15 ` Junio C Hamano
2024-08-15 9:51 ` Phillip Wood
2024-08-15 14:43 ` Junio C Hamano
2024-07-26 5:02 ` Jeff King
2024-07-26 15:02 ` Junio C Hamano
2024-07-27 22:05 ` Jeff King
2024-07-23 2:19 ` [PATCH v2 3/3] safe.directory: setting safe.directory="." allows the "current" directory Junio C Hamano
2024-07-25 9:45 ` Phillip Wood
2024-07-25 16:12 ` Junio C Hamano
2024-07-25 9:45 ` [PATCH v2 0/3] safe.directory clean-up Phillip Wood
2024-07-25 16:14 ` Junio C Hamano
2024-07-30 1:10 ` [PATCH v3 " Junio C Hamano
2024-07-30 1:10 ` [PATCH v3 1/3] safe.directory: normalize the checked path Junio C Hamano
2024-07-30 1:10 ` [PATCH v3 2/3] safe.directory: normalize the configured path Junio C Hamano
2024-07-30 7:31 ` Jeff King
2024-07-30 16:03 ` Junio C Hamano
2024-07-30 20:08 ` Jeff King
2024-07-30 7:43 ` Jeff King
2024-07-30 16:22 ` Junio C Hamano
2024-07-30 17:56 ` safe.directory: preliminary clean-up Junio C Hamano
2024-07-30 20:13 ` Jeff King
2024-07-30 20:10 ` [PATCH v3 2/3] safe.directory: normalize the configured path Jeff King
2024-07-30 1:10 ` [PATCH v3 3/3] safe.directory: setting safe.directory="." allows the "current" directory Junio C Hamano
2024-07-30 18:43 ` Junio C Hamano [this message]
2024-07-30 18:43 ` [PATCH v4 1/4] safe.directory: preliminary clean-up Junio C Hamano
2024-07-30 18:43 ` [PATCH v4 2/4] safe.directory: normalize the checked path Junio C Hamano
2024-07-30 18:43 ` [PATCH v4 3/4] safe.directory: normalize the configured path Junio C Hamano
2024-07-30 18:43 ` [PATCH v4 4/4] safe.directory: setting safe.directory="." allows the "current" directory Junio C Hamano
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=20240730184352.2503276-1-gitster@pobox.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
--cc=phillip.wood123@gmail.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 NNTP newsgroup(s).