]> git.ipfire.org Git - thirdparty/git.git/commitdiff
real_path_if_valid(): remove unsafe API
authorAlexandr Miloslavskiy <alexandr.miloslavskiy@syntevo.com>
Tue, 10 Mar 2020 13:11:23 +0000 (13:11 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 10 Mar 2020 18:41:40 +0000 (11:41 -0700)
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>
abspath.c
cache.h
setup.c
sha1-file.c
submodule.c
worktree.c

index d34026bfeb85b59e7f70d23b4913c7b86d288403..6f15a418bb64e202811a05e14819f6ef6a578b8d 100644 (file)
--- 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 f6937793ec2fdea7f99261bfbf62e42fb789fc93..aa3f5ce718a35de71759a64d553224d2806128eb 100644 (file)
--- 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 1ae3f20301633d0b73c386c2de7e099ad09923e0..9e8fa46bc787da4b909ab1832ffcff511725b4e4 100644 (file)
--- 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.
index 616886799e5906988ac4834d71cd259ee1e540a8..f2b24654895329f7c9acc834cc104bae9aaf739b 100644 (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)
index bad7a788c06da07da5380dc82254f92a45a978df..215c62580fc9fb5a474584475527490cbfc9427c 100644 (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);
index e7bbf716f6bdc6bef43a8ce4ee9e15031d6ef158..543472f0c7bf1b9fc55500220d383bb7ba75a49d 100644 (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;
 }