From: Michael Haggerty <mhagger@alum.mit.edu>
To: Jeff King <peff@peff.net>
Cc: Junio C Hamano <gitster@pobox.com>,
Jiang Xin <worldhello.net@gmail.com>,
Lea Wiemann <lewiemann@gmail.com>, Johannes Sixt <j6t@kdbg.org>,
git@vger.kernel.org, Michael Haggerty <mhagger@alum.mit.edu>
Subject: [PATCH v4 7/8] setup_git_directory_gently_1(): resolve symlinks in ceiling paths
Date: Sun, 28 Oct 2012 17:16:26 +0100 [thread overview]
Message-ID: <1351440987-26636-8-git-send-email-mhagger@alum.mit.edu> (raw)
In-Reply-To: <1351440987-26636-1-git-send-email-mhagger@alum.mit.edu>
longest_ancestor_length() relies on a textual comparison of directory
parts to find the part of path that overlaps with one of the paths in
prefix_list. But this doesn't work if any of the prefixes involves a
symbolic link, because the directories will look different even though
they might logically refer to the same directory. So canonicalize the
paths listed in GIT_CEILING_DIRECTORIES using real_path_if_valid()
before passing them to longest_ancestor_length(). (Also rename
normalize_ceiling_entry() to canonicalize_ceiling_entry() to reflect
the change.)
path is already in canonical form, so doesn't need to be canonicalized
again.
This fixes some problems with using GIT_CEILING_DIRECTORIES that
contains paths involving symlinks, including t4035 if run with --root
set to a path involving symlinks.
Please note that test t0060 is *not* changed analogously, because that
would make the test suite results dependent on the contents of the
local root directory. However, real_path() is already tested
independently, and the "ancestor" tests cover the non-normalization
aspects of longest_ancestor_length(), so coverage remains sufficient.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
setup.c | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/setup.c b/setup.c
index df97ad3..f108c4b 100644
--- a/setup.c
+++ b/setup.c
@@ -622,24 +622,23 @@ static dev_t get_device_or_die(const char *path, const char *prefix, int prefix_
}
/*
- * A "string_list_each_func_t" function that normalizes an entry from
- * GIT_CEILING_DIRECTORIES or discards it if unusable.
+ * A "string_list_each_func_t" function that canonicalizes an entry
+ * from GIT_CEILING_DIRECTORIES using real_path_if_valid(), or
+ * discards it if unusable.
*/
-static int normalize_ceiling_entry(struct string_list_item *item, void *unused)
+static int canonicalize_ceiling_entry(struct string_list_item *item,
+ void *unused)
{
- const char *ceil = item->string;
- int len = strlen(ceil);
- char buf[PATH_MAX+1];
+ char *ceil = item->string;
+ const char *real_path;
- if (len == 0 || len > PATH_MAX || !is_absolute_path(ceil))
+ if (!*ceil || !is_absolute_path(ceil))
return 0;
- if (normalize_path_copy(buf, ceil) < 0)
+ real_path = real_path_if_valid(ceil);
+ if (!real_path)
return 0;
- len = strlen(buf);
- if (len > 1 && buf[len-1] == '/')
- buf[--len] = '\0';
free(item->string);
- item->string = xstrdup(buf);
+ item->string = xstrdup(real_path);
return 1;
}
@@ -681,7 +680,8 @@ static const char *setup_git_directory_gently_1(int *nongit_ok)
if (env_ceiling_dirs) {
string_list_split(&ceiling_dirs, env_ceiling_dirs, PATH_SEP, -1);
- filter_string_list(&ceiling_dirs, 0, normalize_ceiling_entry, NULL);
+ filter_string_list(&ceiling_dirs, 0,
+ canonicalize_ceiling_entry, NULL);
ceil_offset = longest_ancestor_length(cwd, &ceiling_dirs);
string_list_clear(&ceiling_dirs, 0);
}
--
1.8.0
next prev parent reply other threads:[~2012-10-28 16:17 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-28 16:16 [PATCH v4 0/8] Fix GIT_CEILING_DIRECTORIES that contain symlinks Michael Haggerty
2012-10-28 16:16 ` [PATCH v4 1/8] Introduce new static function real_path_internal() Michael Haggerty
2012-10-28 16:16 ` [PATCH v4 2/8] real_path_internal(): add comment explaining use of cwd Michael Haggerty
2012-10-28 16:16 ` [PATCH v4 3/8] Introduce new function real_path_if_valid() Michael Haggerty
2012-10-28 16:16 ` [PATCH v4 4/8] longest_ancestor_length(): use string_list_split() Michael Haggerty
2012-10-28 16:16 ` [PATCH v4 5/8] longest_ancestor_length(): take a string_list argument for prefixes Michael Haggerty
2012-10-28 16:16 ` [PATCH v4 6/8] longest_ancestor_length(): require prefix list entries to be normalized Michael Haggerty
2012-10-30 18:23 ` Ramsay Jones
2012-11-06 7:34 ` Michael Haggerty
2012-10-28 16:16 ` Michael Haggerty [this message]
2012-10-28 16:16 ` [PATCH v4 8/8] string_list_longest_prefix(): remove function Michael Haggerty
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=1351440987-26636-8-git-send-email-mhagger@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j6t@kdbg.org \
--cc=lewiemann@gmail.com \
--cc=peff@peff.net \
--cc=worldhello.net@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).