mirror of
https://git.proxmox.com/git/libgit2
synced 2025-12-25 22:12:55 +00:00
fileutils: Finish dropping the old prettify_path
This commit is contained in:
parent
19ac1ed702
commit
eec3fe394a
147
src/fileops.c
147
src/fileops.c
@ -306,153 +306,6 @@ int git_futils_mkdir_r(const char *path, int mode)
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
static int retrieve_previous_path_component_start(const char *path)
|
||||
{
|
||||
int offset, len, root_offset, start = 0;
|
||||
|
||||
root_offset = git_path_root(path);
|
||||
if (root_offset > -1)
|
||||
start += root_offset;
|
||||
|
||||
len = strlen(path);
|
||||
offset = len - 1;
|
||||
|
||||
/* Skip leading slash */
|
||||
if (path[start] == '/')
|
||||
start++;
|
||||
|
||||
/* Skip trailing slash */
|
||||
if (path[offset] == '/')
|
||||
offset--;
|
||||
|
||||
if (offset < root_offset)
|
||||
return git__throw(GIT_ERROR, "Failed to retrieve path component. Wrong offset");
|
||||
|
||||
while (offset > start && path[offset-1] != '/') {
|
||||
offset--;
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
int git_futils_prettify_dir(char *buffer_out, size_t size, const char *path, const char *base_path)
|
||||
{
|
||||
int len = 0, segment_len, only_dots, root_path_offset, error = GIT_SUCCESS;
|
||||
char *current;
|
||||
const char *buffer_out_start, *buffer_end;
|
||||
|
||||
current = (char *)path;
|
||||
buffer_end = path + strlen(path);
|
||||
buffer_out_start = buffer_out;
|
||||
|
||||
root_path_offset = git_path_root(path);
|
||||
if (root_path_offset < 0) {
|
||||
if (base_path == NULL) {
|
||||
error = p_getcwd(buffer_out, size);
|
||||
if (error < GIT_SUCCESS)
|
||||
return error; /* The callee already takes care of setting the correct error message. */
|
||||
} else {
|
||||
if (size < (strlen(base_path) + 1) * sizeof(char))
|
||||
return git__throw(GIT_EOVERFLOW, "Failed to prettify dir path: the base path is too long for the buffer.");
|
||||
|
||||
strcpy(buffer_out, base_path);
|
||||
git_path_mkposix(buffer_out);
|
||||
git_path_join(buffer_out, buffer_out, "");
|
||||
}
|
||||
|
||||
len = strlen(buffer_out);
|
||||
buffer_out += len;
|
||||
}
|
||||
|
||||
while (current < buffer_end) {
|
||||
/* Prevent multiple slashes from being added to the output */
|
||||
if (*current == '/' && len > 0 && buffer_out_start[len - 1] == '/') {
|
||||
current++;
|
||||
continue;
|
||||
}
|
||||
|
||||
only_dots = 1;
|
||||
segment_len = 0;
|
||||
|
||||
/* Copy path segment to the output */
|
||||
while (current < buffer_end && *current != '/')
|
||||
{
|
||||
only_dots &= (*current == '.');
|
||||
*buffer_out++ = *current++;
|
||||
segment_len++;
|
||||
len++;
|
||||
}
|
||||
|
||||
/* Skip current directory */
|
||||
if (only_dots && segment_len == 1)
|
||||
{
|
||||
current++;
|
||||
buffer_out -= segment_len;
|
||||
len -= segment_len;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Handle the double-dot upward directory navigation */
|
||||
if (only_dots && segment_len == 2)
|
||||
{
|
||||
current++;
|
||||
buffer_out -= segment_len;
|
||||
|
||||
*buffer_out ='\0';
|
||||
len = retrieve_previous_path_component_start(buffer_out_start);
|
||||
|
||||
/* Are we escaping out of the root dir? */
|
||||
if (len < 0)
|
||||
return git__throw(GIT_EINVALIDPATH, "Failed to normalize path `%s`. The path escapes out of the root directory", path);
|
||||
|
||||
buffer_out = (char *)buffer_out_start + len;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Guard against potential multiple dot path traversal (cf http://cwe.mitre.org/data/definitions/33.html) */
|
||||
if (only_dots && segment_len > 0)
|
||||
return git__throw(GIT_EINVALIDPATH, "Failed to normalize path `%s`. The path contains a segment with three `.` or more", path);
|
||||
|
||||
*buffer_out++ = '/';
|
||||
len++;
|
||||
}
|
||||
|
||||
*buffer_out = '\0';
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
int git_futils_prettyify_file(char *buffer_out, size_t size, const char *path, const char *base_path)
|
||||
{
|
||||
int error, path_len, i, root_offset;
|
||||
const char* pattern = "/..";
|
||||
|
||||
path_len = strlen(path);
|
||||
|
||||
/* Let's make sure the filename isn't empty nor a dot */
|
||||
if (path_len == 0 || (path_len == 1 && *path == '.'))
|
||||
return git__throw(GIT_EINVALIDPATH, "Failed to normalize file path `%s`. The path is either empty or equals `.`", path);
|
||||
|
||||
/* Let's make sure the filename doesn't end with "/", "/." or "/.." */
|
||||
for (i = 1; path_len > i && i < 4; i++) {
|
||||
if (!strncmp(path + path_len - i, pattern, i))
|
||||
return git__throw(GIT_EINVALIDPATH, "Failed to normalize file path `%s`. The path points to a folder", path);
|
||||
}
|
||||
|
||||
error = git_futils_prettify_dir(buffer_out, size, path, base_path);
|
||||
if (error < GIT_SUCCESS)
|
||||
return error; /* The callee already takes care of setting the correct error message. */
|
||||
|
||||
path_len = strlen(buffer_out);
|
||||
root_offset = git_path_root(buffer_out) + 1;
|
||||
if (path_len == root_offset)
|
||||
return git__throw(GIT_EINVALIDPATH, "Failed to normalize file path `%s`. The path points to a folder", path);
|
||||
|
||||
/* Remove the trailing slash */
|
||||
buffer_out[path_len - 1] = '\0';
|
||||
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
int git_futils_cmp_path(const char *name1, int len1, int isdir1,
|
||||
const char *name2, int len2, int isdir2)
|
||||
{
|
||||
|
||||
@ -149,54 +149,4 @@ extern int git_futils_direach(
|
||||
extern int git_futils_cmp_path(const char *name1, int len1, int isdir1,
|
||||
const char *name2, int len2, int isdir2);
|
||||
|
||||
|
||||
/**
|
||||
* Clean up a provided absolute or relative directory path.
|
||||
*
|
||||
* This prettification relies on basic operations such as coalescing
|
||||
* multiple forward slashes into a single slash, removing '.' and
|
||||
* './' current directory segments, and removing parent directory
|
||||
* whenever '..' is encountered.
|
||||
*
|
||||
* If not empty, the returned path ends with a forward slash.
|
||||
*
|
||||
* For instance, this will turn "d1/s1///s2/..//../s3" into "d1/s3/".
|
||||
*
|
||||
* This only performs a string based analysis of the path.
|
||||
* No checks are done to make sure the path actually makes sense from
|
||||
* the file system perspective.
|
||||
*
|
||||
* @param buffer_out buffer to populate with the normalized path.
|
||||
* @param size buffer size.
|
||||
* @param path directory path to clean up.
|
||||
* @return
|
||||
* - GIT_SUCCESS on success;
|
||||
* - GIT_ERROR when the input path is invalid or escapes the current directory.
|
||||
*/
|
||||
int git_futils_prettify_dir(char *buffer_out, size_t size, const char *path, const char *base_path);
|
||||
|
||||
/**
|
||||
* Clean up a provided absolute or relative file path.
|
||||
*
|
||||
* This prettification relies on basic operations such as coalescing
|
||||
* multiple forward slashes into a single slash, removing '.' and
|
||||
* './' current directory segments, and removing parent directory
|
||||
* whenever '..' is encountered.
|
||||
*
|
||||
* For instance, this will turn "d1/s1///s2/..//../s3" into "d1/s3".
|
||||
*
|
||||
* This only performs a string based analysis of the path.
|
||||
* No checks are done to make sure the path actually makes sense from
|
||||
* the file system perspective.
|
||||
*
|
||||
* @param buffer_out buffer to populate with the normalized path.
|
||||
* @param size buffer size.
|
||||
* @param path file path to clean up.
|
||||
* @return
|
||||
* - GIT_SUCCESS on success;
|
||||
* - GIT_ERROR when the input path is invalid or escapes the current directory.
|
||||
*/
|
||||
int git_futils_prettyify_file(char *buffer_out, size_t size, const char *path, const char *base_path);
|
||||
|
||||
|
||||
#endif /* INCLUDE_fileops_h__ */
|
||||
|
||||
@ -67,7 +67,7 @@ static int assign_repository_dirs(
|
||||
if (git_dir == NULL)
|
||||
return git__throw(GIT_ENOTFOUND, "Failed to open repository. Git dir not found");
|
||||
|
||||
error = git_futils_prettify_dir(path_aux, sizeof(path_aux), git_dir, NULL);
|
||||
error = git_path_prettify_dir(path_aux, git_dir, NULL);
|
||||
if (error < GIT_SUCCESS)
|
||||
return git__rethrow(error, "Failed to open repository");
|
||||
|
||||
@ -80,7 +80,7 @@ static int assign_repository_dirs(
|
||||
if (git_object_directory == NULL)
|
||||
git_path_join(path_aux, repo->path_repository, GIT_OBJECTS_DIR);
|
||||
else {
|
||||
error = git_futils_prettify_dir(path_aux, sizeof(path_aux), git_object_directory, NULL);
|
||||
error = git_path_prettify_dir(path_aux, git_object_directory, NULL);
|
||||
if (error < GIT_SUCCESS)
|
||||
return git__rethrow(error, "Failed to open repository");
|
||||
}
|
||||
@ -94,7 +94,7 @@ static int assign_repository_dirs(
|
||||
if (git_work_tree == NULL)
|
||||
repo->is_bare = 1;
|
||||
else {
|
||||
error = git_futils_prettify_dir(path_aux, sizeof(path_aux), git_work_tree, NULL);
|
||||
error = git_path_prettify_dir(path_aux, git_work_tree, NULL);
|
||||
if (error < GIT_SUCCESS)
|
||||
return git__rethrow(error, "Failed to open repository");
|
||||
|
||||
@ -107,7 +107,7 @@ static int assign_repository_dirs(
|
||||
if (git_index_file == NULL)
|
||||
git_path_join(path_aux, repo->path_repository, GIT_INDEX_FILE);
|
||||
else {
|
||||
error = git_futils_prettyify_file(path_aux, sizeof(path_aux), git_index_file, NULL);
|
||||
error = git_path_prettify(path_aux, git_index_file, NULL);
|
||||
if (error < GIT_SUCCESS)
|
||||
return git__rethrow(error, "Failed to open repository");
|
||||
}
|
||||
@ -670,12 +670,15 @@ static int repo_init_find_dir(repo_init *results, const char* path)
|
||||
char temp_path[GIT_PATH_MAX];
|
||||
int error;
|
||||
|
||||
error = git_futils_prettify_dir(temp_path, sizeof(temp_path), path, NULL);
|
||||
if (error < GIT_SUCCESS)
|
||||
return git__throw(GIT_ENOTFOUND, "Invalid directory to initialize repository");
|
||||
if (git_futils_isdir(path) < GIT_SUCCESS) {
|
||||
error = git_futils_mkdir_r(path, 0755);
|
||||
if (error < GIT_SUCCESS)
|
||||
return git__throw(GIT_EOSERR,
|
||||
"Failed to initialize repository; cannot create full path");
|
||||
}
|
||||
|
||||
// if (p_realpath(path, temp_path) == NULL)
|
||||
// return git__throw(GIT_ENOTFOUND, "Invalid directory to initialize repository");
|
||||
if (git_path_prettify_dir(temp_path, path, NULL) < GIT_SUCCESS)
|
||||
return git__throw(GIT_ENOTFOUND, "Failed to resolve repository path (%s)", path);
|
||||
|
||||
if (!results->is_bare)
|
||||
git_path_join(temp_path, temp_path, GIT_DIR);
|
||||
|
||||
234
tests/t00-core.c
234
tests/t00-core.c
@ -152,206 +152,6 @@ BEGIN_TEST(path2, "get the latest component in a path")
|
||||
#undef TOPDIR_TEST
|
||||
END_TEST
|
||||
|
||||
typedef int (normalize_path)(char *, size_t, const char *, const char *);
|
||||
|
||||
/* Assert flags */
|
||||
#define CWD_AS_PREFIX 1
|
||||
#define PATH_AS_SUFFIX 2
|
||||
#define ROOTED_PATH 4
|
||||
|
||||
static int ensure_normalized(const char *input_path, const char *expected_path, normalize_path normalizer, int assert_flags)
|
||||
{
|
||||
int error = GIT_SUCCESS;
|
||||
char buffer_out[GIT_PATH_MAX];
|
||||
char current_workdir[GIT_PATH_MAX];
|
||||
|
||||
error = p_getcwd(current_workdir, sizeof(current_workdir));
|
||||
if (error < GIT_SUCCESS)
|
||||
return error;
|
||||
|
||||
error = normalizer(buffer_out, sizeof(buffer_out), input_path, NULL);
|
||||
if (error < GIT_SUCCESS)
|
||||
return error;
|
||||
|
||||
if (expected_path == NULL)
|
||||
return error;
|
||||
|
||||
if ((assert_flags & PATH_AS_SUFFIX) != 0)
|
||||
if (git__suffixcmp(buffer_out, expected_path))
|
||||
return GIT_ERROR;
|
||||
|
||||
if ((assert_flags & CWD_AS_PREFIX) != 0)
|
||||
if (git__prefixcmp(buffer_out, current_workdir))
|
||||
return GIT_ERROR;
|
||||
|
||||
if ((assert_flags & ROOTED_PATH) != 0) {
|
||||
error = strcmp(expected_path, buffer_out);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int ensure_dir_path_normalized(const char *input_path, const char *expected_path, int assert_flags)
|
||||
{
|
||||
return ensure_normalized(input_path, expected_path, git_futils_prettify_dir, assert_flags);
|
||||
}
|
||||
|
||||
static int ensure_file_path_normalized(const char *input_path, const char *expected_path, int assert_flags)
|
||||
{
|
||||
return ensure_normalized(input_path, expected_path, git_futils_prettyify_file, assert_flags);
|
||||
}
|
||||
|
||||
BEGIN_TEST(path3, "prettify and validate a path to a file")
|
||||
must_pass(ensure_file_path_normalized("a", "a", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_file_path_normalized("./testrepo.git", "testrepo.git", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_file_path_normalized("./.git", ".git", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_file_path_normalized("./git.", "git.", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_fail(ensure_file_path_normalized("git./", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized(".", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("./", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("./.", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("./..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("../.", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("./.././/", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/sub/../..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/sub/..///..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/sub///../..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/sub///..///..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/sub/../../..", NULL, 0));
|
||||
must_pass(ensure_file_path_normalized("dir", "dir", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_fail(ensure_file_path_normalized("dir//", NULL, 0));
|
||||
must_pass(ensure_file_path_normalized("./dir", "dir", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_fail(ensure_file_path_normalized("dir/.", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir///./", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/sub/..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir//sub/..",NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir//sub/../", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/sub/../", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/sub/../.", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("dir/s1/../s2/", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("d1/s1///s2/..//../s3/", NULL, 0));
|
||||
must_pass(ensure_file_path_normalized("d1/s1//../s2/../../d2", "d2", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_fail(ensure_file_path_normalized("dir/sub/../", NULL, 0));
|
||||
must_pass(ensure_file_path_normalized("../a/../b/c/d/../../e", "b/e", PATH_AS_SUFFIX));
|
||||
must_fail(ensure_file_path_normalized("....", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("...", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("./...", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("d1/...", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("d1/.../", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("d1/.../d2", NULL, 0));
|
||||
|
||||
must_pass(ensure_file_path_normalized("/a", "/a", ROOTED_PATH));
|
||||
must_pass(ensure_file_path_normalized("/./testrepo.git", "/testrepo.git", ROOTED_PATH));
|
||||
must_pass(ensure_file_path_normalized("/./.git", "/.git", ROOTED_PATH));
|
||||
must_pass(ensure_file_path_normalized("/./git.", "/git.", ROOTED_PATH));
|
||||
must_fail(ensure_file_path_normalized("/git./", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/.", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/./", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/./.", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/./..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/../.", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/./.././/", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/sub/../..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/sub/..///..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/sub///../..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/sub///..///..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/sub/../../..", NULL, 0));
|
||||
must_pass(ensure_file_path_normalized("/dir", "/dir", 0));
|
||||
must_fail(ensure_file_path_normalized("/dir//", NULL, 0));
|
||||
must_pass(ensure_file_path_normalized("/./dir", "/dir", 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/.", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir///./", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/sub/..", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir//sub/..",NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir//sub/../", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/sub/../", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/sub/../.", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/s1/../s2/", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/d1/s1///s2/..//../s3/", NULL, 0));
|
||||
must_pass(ensure_file_path_normalized("/d1/s1//../s2/../../d2", "/d2", 0));
|
||||
must_fail(ensure_file_path_normalized("/dir/sub/../", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/....", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/...", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/./...", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/d1/...", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/d1/.../", NULL, 0));
|
||||
must_fail(ensure_file_path_normalized("/d1/.../d2", NULL, 0));
|
||||
END_TEST
|
||||
|
||||
BEGIN_TEST(path4, "validate and prettify a path to a folder")
|
||||
must_pass(ensure_dir_path_normalized("./testrepo.git", "testrepo.git/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("./.git", ".git/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("./git.", "git./", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("git./", "git./", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("", "", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized(".", "", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("./", "", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("./.", "", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/..", "", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/sub/../..", "", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/sub/..///..", "", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/sub///../..", "", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/sub///..///..", "", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir//", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("./dir", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/.", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir///./", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/sub/..", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir//sub/..", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir//sub/../", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/sub/../", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/sub/../.", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/s1/../s2/", "dir/s2/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("d1/s1///s2/..//../s3/", "d1/s3/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("d1/s1//../s2/../../d2", "d2/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("dir/sub/../", "dir/", CWD_AS_PREFIX | PATH_AS_SUFFIX));
|
||||
must_pass(ensure_dir_path_normalized("../a/../b/c/d/../../e", "b/e/", PATH_AS_SUFFIX));
|
||||
must_fail(ensure_dir_path_normalized("....", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("...", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("./...", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("d1/...", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("d1/.../", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("d1/.../d2", NULL, 0));
|
||||
|
||||
must_pass(ensure_dir_path_normalized("/./testrepo.git", "/testrepo.git/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/./.git", "/.git/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/./git.", "/git./", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/git./", "/git./", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/", "/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("//", "/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("///", "/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/.", "/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/./", "/", ROOTED_PATH));
|
||||
must_fail(ensure_dir_path_normalized("/./..", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("/../.", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("/./.././/", NULL, 0));
|
||||
must_pass(ensure_dir_path_normalized("/dir/..", "/", 0));
|
||||
must_pass(ensure_dir_path_normalized("/dir/sub/../..", "/", 0));
|
||||
must_fail(ensure_dir_path_normalized("/dir/sub/../../..", NULL, 0));
|
||||
must_pass(ensure_dir_path_normalized("/dir", "/dir/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/dir//", "/dir/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/./dir", "/dir/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/dir/.", "/dir/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/dir///./", "/dir/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/dir//sub/..", "/dir/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/dir/sub/../", "/dir/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("//dir/sub/../.", "/dir/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/dir/s1/../s2/", "/dir/s2/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/d1/s1///s2/..//../s3/", "/d1/s3/", ROOTED_PATH));
|
||||
must_pass(ensure_dir_path_normalized("/d1/s1//../s2/../../d2", "/d2/", ROOTED_PATH));
|
||||
must_fail(ensure_dir_path_normalized("/....", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("/...", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("/./...", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("/d1/...", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("/d1/.../", NULL, 0));
|
||||
must_fail(ensure_dir_path_normalized("/d1/.../d2", NULL, 0));
|
||||
END_TEST
|
||||
|
||||
static int ensure_joinpath(const char *path_a, const char *path_b, const char *expected_path)
|
||||
{
|
||||
char joined_path[GIT_PATH_MAX];
|
||||
@ -390,37 +190,6 @@ BEGIN_TEST(path6, "properly join path components for more than one path")
|
||||
must_pass(ensure_joinpath_n("a", "b", "", "/c/d", "a/b/c/d"));
|
||||
END_TEST
|
||||
|
||||
static int count_number_of_path_segments(const char *path)
|
||||
{
|
||||
int number = 0;
|
||||
char *current = (char *)path;
|
||||
|
||||
while (*current)
|
||||
{
|
||||
if (*current++ == '/')
|
||||
number++;
|
||||
}
|
||||
|
||||
assert (number > 0);
|
||||
|
||||
return --number;
|
||||
}
|
||||
|
||||
BEGIN_TEST(path7, "prevent a path which escapes the root directory from being prettified")
|
||||
char current_workdir[GIT_PATH_MAX];
|
||||
char prettified[GIT_PATH_MAX];
|
||||
int i = 0, number_to_escape;
|
||||
|
||||
must_pass(p_getcwd(current_workdir, sizeof(current_workdir)));
|
||||
|
||||
number_to_escape = count_number_of_path_segments(current_workdir);
|
||||
|
||||
for (i = 0; i < number_to_escape + 1; i++)
|
||||
git_path_join(current_workdir, current_workdir, "../");
|
||||
|
||||
must_fail(git_futils_prettify_dir(prettified, sizeof(prettified), current_workdir, NULL));
|
||||
END_TEST
|
||||
|
||||
typedef struct name_data {
|
||||
int count; /* return count */
|
||||
char *name; /* filename */
|
||||
@ -715,11 +484,8 @@ BEGIN_SUITE(core)
|
||||
ADD_TEST(path0);
|
||||
ADD_TEST(path1);
|
||||
ADD_TEST(path2);
|
||||
ADD_TEST(path3);
|
||||
ADD_TEST(path4);
|
||||
ADD_TEST(path5);
|
||||
ADD_TEST(path6);
|
||||
ADD_TEST(path7);
|
||||
|
||||
ADD_TEST(dirent0);
|
||||
ADD_TEST(dirent1);
|
||||
|
||||
@ -374,7 +374,7 @@ static int append_ceiling_dir(char *ceiling_dirs, const char *path)
|
||||
int len = strlen(ceiling_dirs);
|
||||
int error;
|
||||
|
||||
error = git_futils_prettify_dir(ceiling_dirs + len + (len ? 1 : 0), GIT_PATH_MAX, path, NULL);
|
||||
error = git_path_prettify_dir(ceiling_dirs + len + (len ? 1 : 0), path, NULL);
|
||||
if (error < GIT_SUCCESS)
|
||||
return git__rethrow(error, "Failed to append ceiling directory.");
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user