Skip to content

Commit

Permalink
Merge pull request #5131 from pks-t/pks/fileops-mkdir-in-root
Browse files Browse the repository at this point in the history
fileops: fix creation of directory in filesystem root
  • Loading branch information
pks-t committed Jul 12, 2019
2 parents dacac9e + 5ae22a6 commit f92d495
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 3 deletions.
4 changes: 3 additions & 1 deletion src/fileops.c
Expand Up @@ -495,7 +495,9 @@ int git_futils_mkdir(
* equal to length of the root path). The path may be less than the
* root path length on Windows, where `C:` == `C:/`.
*/
if ((len == 1 && parent_path.ptr[0] == '.') || len <= root_len) {
if ((len == 1 && parent_path.ptr[0] == '.') ||
(len == 1 && parent_path.ptr[0] == '/') ||
len <= root_len) {
relative = make_path.ptr;
break;
}
Expand Down
45 changes: 43 additions & 2 deletions tests/repo/init.c
Expand Up @@ -878,14 +878,55 @@ void test_repo_init__at_filesystem_root(void)
git_repository_free(repo);
}

void test_repo_init__nonexistent_paths(void)
void test_repo_init__nonexisting_directory(void)

This comment has been minimized.

Copy link
@Janet85

Janet85 Sep 24, 2019

fileops: fix creation of directory in filesystem root

{
git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
git_repository *repo;

/*
* If creating a repo with non-existing parent directories, then libgit2
* will by default create the complete directory hierarchy if using
* `git_repository_init`. Thus, let's use the extended version and not
* set the `GIT_REPOSITORY_INIT_MKPATH` flag.
*/
cl_git_fail(git_repository_init_ext(&repo, "nonexisting/path", &opts));
}

void test_repo_init__nonexisting_root(void)
{
#ifdef GIT_WIN32
git_repository *repo;

/*
* This really only depends on the nonexistence of the Q: drive. We
* cannot implement the equivalent test on Unix systems, as there is
* fundamentally no path that is disconnected from the root directory.
*/
cl_git_fail(git_repository_init(&repo, "Q:/non/existent/path", 0));
cl_git_fail(git_repository_init(&repo, "Q:\\non\\existent\\path", 0));
#else
cl_git_fail(git_repository_init(&repo, "/non/existent/path", 0));
clar__skip();
#endif
}

void test_repo_init__unwriteable_directory(void)
{
#ifndef GIT_WIN32
git_repository *repo;

if (geteuid() == 0)
clar__skip();

/*
* Create a non-writeable directory so that we cannot create directories
* inside of it. The root user has CAP_DAC_OVERRIDE, so he doesn't care
* for the directory permissions and thus we need to skip the test if
* run as root user.
*/
cl_must_pass(p_mkdir("unwriteable", 0444));
cl_git_fail(git_repository_init(&repo, "unwriteable/repo", 0));
cl_must_pass(p_rmdir("unwriteable"));
#else
clar__skip();
#endif
}

0 comments on commit f92d495

Please sign in to comment.