The amount of tweaks seemed deserving of a reroll, so here it is: * Added your test Junio, with what I figured was an appropriate commit message describing the user-visible effect (to git-add since I think it's the simplest to explain), the commit message for the second commit has been reduced somewhat, to not duplicate the message completely. * Duplicated quite a bit of the explanation from this first commit into the last commit, in order to be more obvious about the issue it fixes, I'm not sure if it's a bit too much? * Reworded the last commit to not mention the full-path special case, and replaced all occurences of in-repo with "inside work tree" or similar. * Content-wise compared to 'pu' I've tweaked a few comments, un-inlined and added the wtlen <= len check (and the ls-files test is new of course): diff --git a/setup.c b/setup.c index 32a6f6b..ba08885 100644 --- a/setup.c +++ b/setup.c @@ -6,8 +6,8 @@ static int inside_git_dir = -1; static int inside_work_tree = -1; /* - * No checking if the path is in fact an absolute path is done, and it must - * already be normalized. + * The input parameter must contain an absolute path, and it must already be + * normalized. * * Find the part of an absolute path that lies inside the work tree by * dereferencing symlinks outside the work tree, for example: @@ -17,7 +17,7 @@ static int inside_work_tree = -1; * /dir/repolink/file (repolink points to /dir/repo) -> file * /dir/repo (exactly equal to work tree) -> (empty string) */ -static inline int abspath_part_inside_repo(char *path) +static int abspath_part_inside_repo(char *path) { size_t len; size_t wtlen; @@ -32,7 +32,7 @@ static inline int abspath_part_inside_repo(char *path) off = 0; /* check if work tree is already the prefix */ - if (strncmp(path, work_tree, wtlen) == 0) { + if (wtlen <= len && !strncmp(path, work_tree, wtlen)) { if (path[wtlen] == '/') { memmove(path, path + wtlen + 1, len - wtlen); return 0; @@ -47,7 +47,7 @@ static inline int abspath_part_inside_repo(char *path) path0 = path; path += offset_1st_component(path) + off; - /* check each level */ + /* check each '/'-terminated level */ while (*path) { path++; if (*path == '/') { Junio C Hamano (1): t3004: Add test for ls-files on symlinks via absolute paths Martin Erik Werner (5): t0060: Add test for prefix_path on symlinks via absolute paths t0060: Add test for prefix_path when path == work tree t0060: Add tests for prefix_path when path begins with work tree setup: Add 'abspath_part_inside_repo' function setup: Don't dereference in-tree symlinks for absolute paths setup.c | 94 +++++++++++++++++++++++++++++++++++++---------- t/t0060-path-utils.sh | 21 +++++++++++ t/t3004-ls-files-basic.sh | 17 +++++++++ 3 files changed, 112 insertions(+), 20 deletions(-) -- 1.8.5.2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html