summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandr Miloslavskiy <alexandr.miloslavskiy@syntevo.com>2020-03-10 13:11:23 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-03-10 18:41:40 (GMT)
commit4530a85b4c34f009b5f190eb2dc8367801de5028 (patch)
tree8e6a4c01147521978d89637b87d50ab75546d647
parent3d7747e318532a36a263c61cdf92f2decb6424ff (diff)
downloadgit-4530a85b4c34f009b5f190eb2dc8367801de5028.zip
git-4530a85b4c34f009b5f190eb2dc8367801de5028.tar.gz
git-4530a85b4c34f009b5f190eb2dc8367801de5028.tar.bz2
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>
-rw-r--r--abspath.c10
-rw-r--r--cache.h1
-rw-r--r--setup.c2
-rw-r--r--sha1-file.c13
-rw-r--r--submodule.c7
-rw-r--r--worktree.c7
6 files changed, 14 insertions, 26 deletions
diff --git a/abspath.c b/abspath.c
index d34026b..6f15a41 100644
--- a/abspath.c
+++ b/abspath.c
@@ -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;
diff --git a/cache.h b/cache.h
index f693779..aa3f5ce 100644
--- a/cache.h
+++ b/cache.h
@@ -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);
diff --git a/setup.c b/setup.c
index 1ae3f20..9e8fa46 100644
--- a/setup.c
+++ b/setup.c
@@ -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.
diff --git a/sha1-file.c b/sha1-file.c
index 6168867..f2b2465 100644
--- a/sha1-file.c
+++ b/sha1-file.c
@@ -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)
diff --git a/submodule.c b/submodule.c
index bad7a78..215c625 100644
--- a/submodule.c
+++ b/submodule.c
@@ -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);
diff --git a/worktree.c b/worktree.c
index e7bbf71..543472f 100644
--- a/worktree.c
+++ b/worktree.c
@@ -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;
}