• Show log

    Commit

  • Hash : 5ae22a63
    Author : Patrick Steinhardt
    Date : 2019-06-21T08:13:31

    fileops: fix creation of directory in filesystem root
    
    In commit 45f24e787 (git_repository_init: stop traversing at
    windows root, 2019-04-12), we have fixed `git_futils_mkdir` to
    correctly handle the case where we create a directory in
    Windows-style filesystem roots like "C:\repo".
    
    The problem here is an off-by-one: previously, to that commit,
    we've been checking wether the parent directory's length is equal
    to the root directory's length incremented by one. When we call
    the function with "/example", then the parent directory's length
    ("/") is 1, but the root directory offset is 0 as the path is
    directly rooted without a drive prefix. This resulted in `1 == 0 +
    1`, which was true. With the change, we've stopped incrementing
    the root directory length, and thus now compare `1 <= 0`, which
    is false.
    
    The previous way of doing it was kind of finicky any non-obvious,
    which is also why the error was introduced. So instead of just
    re-adding the increment, let's explicitly add a condition that
    aborts finding the parent if the current parent path is "/".
    
    Making this change causes Azure Pipelines to fail the testcase
    repo::init::nonexistent_paths on Unix-based systems. This is because we
    have just fixed creating directories in the filesystem root, which
    previously didn't work. As Docker-based tests are running as root user,
    we are thus able to create the non-existing path and will now succeed to
    create the repository that was expected to actually fail.
    
    Let's split this up into three different tests:
    
    - A test to verify that we do not create repos in a non-existing parent
      directoy if the flag `GIT_REPOSITORY_INIT_MKPATH` is not set.
    
    - A test to verify that we fail if the root directory does not exist. As
      there is a common root directory on Unix-based systems that always
      exist, we can only test for this on Windows-based systems.
    
    - A test to verify that we fail if trying to create a repository in an
      unwriteable parent directory. We can only test this if not running
      tests as root user, as CAP_DAC_OVERRIDE will cause us to ignore
      permissions when creating files.