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
This commit is contained in:
Junio C Hamano 2017-01-18 15:12:16 -08:00
commit 1c16df23b1
2 changed files with 7 additions and 3 deletions

View file

@ -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);

4
dir.c
View file

@ -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);