summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-01-18 15:12:16 -0800
committerJunio C Hamano <gitster@pobox.com>2017-01-18 15:12:16 -0800
commit1c16df23b19e8d37d896e68c92d8341d6e60b4dc (patch)
treed7e0ab46f28e103de500cee9d6edbb987bd40a96
parent5918bdcf26030a2540ac25d5b8cbee82fad219fc (diff)
parent0b9864aa28ba08d7fb901afee1a75a15e4ad431b (diff)
downloadgit-1c16df23b19e8d37d896e68c92d8341d6e60b4dc.tar.gz
Merge branch 'bw/realpath-wo-chdir'
The implementation of "real_path()" was to go there with chdir(2) and call getcwd(3), but this obviously wouldn't be usable in a threaded environment. Rewrite it to manually resolve relative paths including symbolic links in path components. * bw/realpath-wo-chdir: real_path: set errno when max number of symlinks is exceeded real_path: prevent redefinition of MAXSYMLINKS
-rw-r--r--abspath.c6
-rw-r--r--dir.c4
2 files changed, 7 insertions, 3 deletions
diff --git a/abspath.c b/abspath.c
index 1d56f5ed9f..fce40fddcc 100644
--- a/abspath.c
+++ b/abspath.c
@@ -62,7 +62,9 @@ static void get_root_part(struct strbuf *resolved, struct strbuf *remaining)
}
/* We allow "recursive" symbolic links. Only within reason, though. */
-#define MAXSYMLINKS 5
+#ifndef MAXSYMLINKS
+#define MAXSYMLINKS 32
+#endif
/*
* Return the real path (i.e., absolute path, with symlinks resolved
@@ -139,6 +141,8 @@ char *strbuf_realpath(struct strbuf *resolved, const char *path,
strbuf_reset(&symlink);
if (num_symlinks++ > MAXSYMLINKS) {
+ errno = ELOOP;
+
if (die_on_error)
die("More than %d nested symlinks "
"on path '%s'", MAXSYMLINKS, path);
diff --git a/dir.c b/dir.c
index 4ac63bc940..65c3e681b8 100644
--- a/dir.c
+++ b/dir.c
@@ -2731,8 +2731,8 @@ void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_)
{
struct strbuf file_name = STRBUF_INIT;
struct strbuf rel_path = STRBUF_INIT;
- char *git_dir = xstrdup(real_path(git_dir_));
- char *work_tree = xstrdup(real_path(work_tree_));
+ char *git_dir = real_pathdup(git_dir_);
+ char *work_tree = real_pathdup(work_tree_);
/* Update gitfile */
strbuf_addf(&file_name, "%s/.git", work_tree);