real_path_if_valid(): remove unsafe API

This commit continues the work started with previous commit.

Signed-off-by: Alexandr Miloslavskiy <alexandr.miloslavskiy@syntevo.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Alexandr Miloslavskiy 2020-03-10 13:11:23 +00:00 committed by Junio C Hamano
parent 3d7747e318
commit 4530a85b4c
6 changed files with 14 additions and 26 deletions

View File

@ -202,16 +202,6 @@ error_out:
return retval;
}
/*
* Resolve `path` into an absolute, cleaned-up path. The return value
* comes from a shared buffer.
*/
const char *real_path_if_valid(const char *path)
{
static struct strbuf realpath = STRBUF_INIT;
return strbuf_realpath(&realpath, path, 0);
}
char *real_pathdup(const char *path, int die_on_error)
{
struct strbuf realpath = STRBUF_INIT;

View File

@ -1314,7 +1314,6 @@ static inline int is_absolute_path(const char *path)
int is_directory(const char *);
char *strbuf_realpath(struct strbuf *resolved, const char *path,
int die_on_error);
const char *real_path_if_valid(const char *path);
char *real_pathdup(const char *path, int die_on_error);
const char *absolute_path(const char *path);
char *absolute_pathdup(const char *path);

View File

@ -886,7 +886,7 @@ static dev_t get_device_or_die(const char *path, const char *prefix, int prefix_
/*
* A "string_list_each_func_t" function that canonicalizes an entry
* from GIT_CEILING_DIRECTORIES using real_path_if_valid(), or
* from GIT_CEILING_DIRECTORIES using real_pathdup(), or
* discards it if unusable. The presence of an empty entry in
* GIT_CEILING_DIRECTORIES turns off canonicalization for all
* subsequent entries.

View File

@ -676,20 +676,15 @@ void add_to_alternates_memory(const char *reference)
char *compute_alternate_path(const char *path, struct strbuf *err)
{
char *ref_git = NULL;
const char *repo, *ref_git_s;
const char *repo;
int seen_error = 0;
ref_git_s = real_path_if_valid(path);
if (!ref_git_s) {
ref_git = real_pathdup(path, 0);
if (!ref_git) {
seen_error = 1;
strbuf_addf(err, _("path '%s' does not exist"), path);
goto out;
} else
/*
* Beware: read_gitfile(), real_path() and mkpath()
* return static buffer
*/
ref_git = xstrdup(ref_git_s);
}
repo = read_gitfile(ref_git);
if (!repo)

View File

@ -2173,7 +2173,7 @@ const char *get_superproject_working_tree(void)
static struct strbuf realpath = STRBUF_INIT;
struct child_process cp = CHILD_PROCESS_INIT;
struct strbuf sb = STRBUF_INIT;
const char *one_up = real_path_if_valid("../");
struct strbuf one_up = STRBUF_INIT;
const char *cwd = xgetcwd();
const char *ret = NULL;
const char *subpath;
@ -2188,10 +2188,11 @@ const char *get_superproject_working_tree(void)
*/
return NULL;
if (!one_up)
if (!strbuf_realpath(&one_up, "../", 0))
return NULL;
subpath = relative_path(cwd, one_up, &sb);
subpath = relative_path(cwd, one_up.buf, &sb);
strbuf_release(&one_up);
prepare_submodule_repo_env(&cp.env_array);
argv_array_pop(&cp.env_array);

View File

@ -226,17 +226,20 @@ struct worktree *find_worktree(struct worktree **list,
struct worktree *find_worktree_by_path(struct worktree **list, const char *p)
{
struct strbuf wt_path = STRBUF_INIT;
char *path = real_pathdup(p, 0);
if (!path)
return NULL;
for (; *list; list++) {
const char *wt_path = real_path_if_valid((*list)->path);
if (!strbuf_realpath(&wt_path, (*list)->path, 0))
continue;
if (wt_path && !fspathcmp(path, wt_path))
if (!fspathcmp(path, wt_path.buf))
break;
}
free(path);
strbuf_release(&wt_path);
return *list;
}