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>
Alexandr Miloslavskiy committed
Mar 10, 2020 at 13:11 UTC
4530a85b4c34f009b5f190eb2dc8367801de5028
6 files changed
+14
-26
abspath.c
-10
@@ -202,16 +202,6 @@ error_out:
202
return retval;
203
}
204
205
-/*
206
- * Resolve `path` into an absolute, cleaned-up path. The return value
207
- * comes from a shared buffer.
208
- */
209
-const char *real_path_if_valid(const char *path)
210
-{
211
- static struct strbuf realpath = STRBUF_INIT;
212
- return strbuf_realpath(&realpath, path, 0);
213
-}
214
-
205
char *real_pathdup(const char *path, int die_on_error)
206
{
207
struct strbuf realpath = STRBUF_INIT;
cache.h
-1
@@ -1314,7 +1314,6 @@ static inline int is_absolute_path(const char *path)
1314
int is_directory(const char *);
1315
char *strbuf_realpath(struct strbuf *resolved, const char *path,
1316
int die_on_error);
1317
-const char *real_path_if_valid(const char *path);
1317
char *real_pathdup(const char *path, int die_on_error);
1318
const char *absolute_path(const char *path);
1319
char *absolute_pathdup(const char *path);
setup.c
+1
-1
@@ -886,7 +886,7 @@ static dev_t get_device_or_die(const char *path, const char *prefix, int prefix_
886
887
/*
888
* A "string_list_each_func_t" function that canonicalizes an entry
889
- * from GIT_CEILING_DIRECTORIES using real_path_if_valid(), or
889
+ * from GIT_CEILING_DIRECTORIES using real_pathdup(), or
890
* discards it if unusable. The presence of an empty entry in
891
* GIT_CEILING_DIRECTORIES turns off canonicalization for all
892
* subsequent entries.
sha1-file.c
+4
-9
@@ -676,20 +676,15 @@ void add_to_alternates_memory(const char *reference)
676
char *compute_alternate_path(const char *path, struct strbuf *err)
677
{
678
char *ref_git = NULL;
679
- const char *repo, *ref_git_s;
679
+ const char *repo;
680
int seen_error = 0;
681
682
- ref_git_s = real_path_if_valid(path);
683
- if (!ref_git_s) {
682
+ ref_git = real_pathdup(path, 0);
683
+ if (!ref_git) {
684
seen_error = 1;
685
strbuf_addf(err, _("path '%s' does not exist"), path);
686
goto out;
687
- } else
688
- /*
689
- * Beware: read_gitfile(), real_path() and mkpath()
690
- * return static buffer
691
- */
692
- ref_git = xstrdup(ref_git_s);
687
+ }
688
689
repo = read_gitfile(ref_git);
690
if (!repo)
submodule.c
+4
-3
@@ -2173,7 +2173,7 @@ const char *get_superproject_working_tree(void)
2173
static struct strbuf realpath = STRBUF_INIT;
2174
struct child_process cp = CHILD_PROCESS_INIT;
2175
struct strbuf sb = STRBUF_INIT;
2176
- const char *one_up = real_path_if_valid("../");
2176
+ struct strbuf one_up = STRBUF_INIT;
2177
const char *cwd = xgetcwd();
2178
const char *ret = NULL;
2179
const char *subpath;
@@ -2188,10 +2188,11 @@ const char *get_superproject_working_tree(void)
2188
*/
2189
return NULL;
2190
2191
- if (!one_up)
2191
+ if (!strbuf_realpath(&one_up, "../", 0))
2192
return NULL;
2193
2194
- subpath = relative_path(cwd, one_up, &sb);
2194
+ subpath = relative_path(cwd, one_up.buf, &sb);
2195
+ strbuf_release(&one_up);
2196
2197
prepare_submodule_repo_env(&cp.env_array);
2198
argv_array_pop(&cp.env_array);
worktree.c
+5
-2
@@ -226,17 +226,20 @@ struct worktree *find_worktree(struct worktree **list,
226
227
struct worktree *find_worktree_by_path(struct worktree **list, const char *p)
228
{
229
+ struct strbuf wt_path = STRBUF_INIT;
230
char *path = real_pathdup(p, 0);
231
232
if (!path)
233
return NULL;
234
for (; *list; list++) {
234
- const char *wt_path = real_path_if_valid((*list)->path);
235
+ if (!strbuf_realpath(&wt_path, (*list)->path, 0))
236
+ continue;
237
236
- if (wt_path && !fspathcmp(path, wt_path))
238
+ if (!fspathcmp(path, wt_path.buf))
239
break;
240
}
241
free(path);
242
+ strbuf_release(&wt_path);
243
return *list;
244
}
245