Commit 3644e98f by nulltoken Committed by Vicent Marti

Fix detection of attempt to escape the root directory on Windows

parent c90292ce
......@@ -503,13 +503,15 @@ int gitfo_mkdir_recurs(const char *path, int mode)
static int retrieve_previous_path_component_start(const char *path)
{
int offset, len, start = 0;
int offset, len, root_offset, start = 0;
root_offset = retrieve_path_root_offset(path);
if (root_offset > -1)
start += root_offset;
len = strlen(path);
offset = len - 1;
//TODO: Deal with Windows rooted path
/* Skip leading slash */
if (path[start] == '/')
start++;
......@@ -518,7 +520,7 @@ static int retrieve_previous_path_component_start(const char *path)
if (path[offset] == '/')
offset--;
if (offset < 0)
if (offset < root_offset)
return GIT_ERROR;
while (offset > start && path[offset-1] != '/') {
......
......@@ -389,6 +389,37 @@ 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(gitfo_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__joinpath(current_workdir, current_workdir, "../");
must_fail(gitfo_prettify_dir_path(prettified, sizeof(prettified), current_workdir));
END_TEST
typedef struct name_data {
int count; /* return count */
char *name; /* filename */
......@@ -645,6 +676,7 @@ BEGIN_SUITE(core)
ADD_TEST(path4);
ADD_TEST(path5);
ADD_TEST(path6);
ADD_TEST(path7);
ADD_TEST(dirent0);
ADD_TEST(dirent1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment